2011-12-22 34 views
0

我有一个表测试甲骨文实体框架参数传递到命令文本

CREATE TABLE TEST 
(
    ID NUMBER, 
    NAME VARCHAR2(30 BYTE) 
) 


CREATE OR REPLACE TRIGGER test_trigger 
BEFORE INSERT 
ON test 
REFERENCING NEW AS NEW 
FOR EACH ROW 
BEGIN 
SELECT test_sequence.nextval INTO :NEW.ID FROM dual; 
END; 

ALTER TABLE TEST ADD (
    PRIMARY KEY 
(ID) 

现在我想从一个页面,从文本框的值插入。

的代码如下

protected void ASPxButton1_Click(object sender, EventArgs e) 
    { 
     //string name = Convert.ToString(ASPxTextBox1.Text); 
     int retVal = 0; 
     string providerName = "Oracle.DataAccess.Client"; 
     string constr = 
       @"User Id=scott;Password=tiger;Data Source=orcl;enlist=true"; 

     // Get the provider factory. 
     DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); 

     try 
     { 

      using (scope txn = new scope()) 
      { 
       using (DbConnection conn1 = factory.CreateConnection()) 
       { 
        conn1.ConnectionString = constr; 
        conn1.Open(); 

        // Create a command to execute the sql statement. 
        DbCommand cmd1 = factory.CreateCommand(); 
        cmd1.Connection = conn1; 
        cmd1.CommandText = @"insert into test ([NAME]) values (:name)"; 
        //OracleParameter Nameprm = cmd1.Parameters.Add("name" , OracleDbType.Varchar2, 10); 
        //Nameprm.Direction = ParameterDirection.Input; 
        //Nameprm.Value = ASPxTextBox1; 
        var name = Convert.ToString(ASPxTextBox1); 
        var parameter = factory.CreateParameter(); 
        parameter.DbType = System.Data.DbType.String; 
        parameter.ParameterName = "@name"; 
        parameter.Value = name; 
        cmd1.Parameters.Add(parameter); 

        retVal = cmd1.ExecuteNonQuery(); 

        //Console.WriteLine("Rows to be affected by cmd1: {0}", retVal); 

        // Close the connection and dispose the command object. 
        conn1.Close(); 
        conn1.Dispose(); 
        cmd1.Dispose(); 

       } 

       txn.SaveChanges(); 
      } 

     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 
} 

给出,但我总是得到ORA-00928:缺少SELECT关键字。但如果我直接给它的值,然后插入数据。我试图用很多方式解决它,但仍然没有运气。当我卡在这里时,您的帮助将非常感激。先谢谢你。

回答

0

@competent_tech的答案看起来不错,作为一个额外的想法:

在我上一份工作,但一我们使用了为我们所有的持久性提供了大量的Oracle数据库,并且我对这类问题无能为力。当我停止使用内置的ADO.Net驱动程序并使用Oracle提供的驱动程序(如Microsoft here所建议的)时,大多数程序都解决了。

您可以为您的Oracle here版本获得用于.Net(ODP.Net)的Oracle数据提供程序。

如果您已经使用ODP.Net诚挚的歉意,这一点很难从代码片段:)

告诉如果名字是没有问题的,那么它可能是与参数式(OracleDBType.VarChar2,虽然这应该由DbType之推断你)或参数方向(ParameterDirection.InputOnly参数?)

我希望可以帮助:)

+0

卡尔林奇先生感谢您分享您的经验。从我的项目开始,我总是尝试使用odp.net(odac)。以下是我的库使用System;使用System.Data的 – tanvir 2011-12-22 07:05:41

+0

; using System.Data.Common;使用Oracle.DataAccess.Client的 ; using System.Collections.Generic;使用System.Linq的 ; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; – tanvir 2011-12-22 07:06:52

+1

是的,我试着用或不用parameter.direction。在两种情况下,它的工作。最后我遇到了问题。它的行var name = Convert.ToString(ASPxTextBox1);那应该是ar名称= Convert.ToString(ASPxTextBox1.text);. Lollz我的想法非常令人毛骨悚然。在按Tab之前需要查看。无论如何非常感谢。 – tanvir 2011-12-22 07:09:44

0

我不认为你的参数名称是正确的。

尝试改变:

parameter.ParameterName = "@name"; 

parameter.ParameterName = "name"; 
+0

'code' parameter.ParameterName =“@名称”;和'code' parameter.ParameterName =“name”;两个作品。问题在于var name = Convert.ToString(ASPxTextBox1);那应该是var name = Convert.ToString(ASPxTextBox1.text)。现在它可以工作。感谢您的亲切合作。我想再次收到您的来信。 – tanvir 2011-12-22 07:11:33