2011-12-22 50 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