2013-02-11 48 views
1

我們正在嘗試使用Devart Oracle適配器,但與使用Oracle的DataAccess DLL的現有代碼存在問題。我們得到command.ExecuteNonQuery()下面的例子錯誤:Devart Oracle。插入並返回ID

ORA-01400:無法將NULL插入 ( 「數據庫名」 「表格名」 「COL3」)

下面是一些示例代碼:

const string query = @"INSERT INTO table_name (table_name_id, col1, col2, col3) 
    VALUES(table_name_id_seq.nextval, :col1, :col2, :col3) 
    RETURNING table_name_id INTO :output_id"; 
OracleParameter outputParam = new OracleParameter(":output_id", OracleDbType.Long, ParameterDirection.Output); 
OracleParameter[] parameters = new OracleParameter[] 
{ 
    outputParam, 
    new OracleParameter(":col1", OracleDbType.VarChar, col1, ParameterDirection.Input), 
    new OracleParameter(":col2", OracleDbType.VarChar, col2, ParameterDirection.Input), 
    new OracleParameter(":col3", OracleDbType.Long, col3, ParameterDirection.Input) 
} 

using (OracleCommand command = connection.CreateCommand()) 
{ 
    command.CommandText = query; 
    command.CommandType = CommandType.Text; 
    command.Parameters.AddRange(parameters); 
    command.ExecuteNonQuery(); 
    int outputId = Convert.ToInt32(outputParam.Value.ToString()); 
} 

我們做錯了什麼?我們試圖使用PK序列插入一行,並在一個查詢中返回該行的PK。

此外,查詢運行良好,如果我刪除輸出參數和查詢中的返回行。

+0

我發生了兩種可能性。使用命名參數有時無法按預期工作,並且必須按正確的順序給它們 - 所以將輸出參數移動到數組的末尾可能會有所幫助。但是更可能的是,從[this](http://www.devart.com/dotconnect/oracle/articles/parameters.html)看起來也許你不應該在第一個參數的'OracleParameter'中冒號?不是我用過的東西,儘管如此猜測真的... – 2013-02-11 22:22:44

+0

@AlexPoole感謝您的想法。我嘗試按順序添加參數並收到相同的錯誤。我認爲按命名綁定並不重要?我還嘗試在創建參數時刪除冒號,但仍收到錯誤消息。有趣的是,我們有數以百計的其他查詢都以相同的方式創建了這些參數,並且它們似乎都起作用。只是這個查詢中有RETURNING關鍵字。 – xbrady 2013-02-12 00:05:07

+0

順序應該不重要,但我看到它不起作用(現在無法找到鏈接)。無論如何,這不是問題。對不起,我忍不住了! – 2013-02-12 10:12:36

回答

0

謝謝您的報告。我們轉載了這個問題並正在調查。作爲解決方法,請切換到直接模式:http://www.devart.com/dotconnect/oracle/docs/?directmode.html

+0

謝謝,我們很遺憾不能在我們的網絡上使用直接模式。作爲解決方法,我們只是將其更改爲兩個查詢。一個選擇nextval序列,一個選擇插入序列。這將工作正常,直到你們能夠解決這個問題。 – xbrady 2013-02-12 16:31:13

+0

@xbrady請將表中的DDL腳本發送到我們的支持地址:http://www.devart.com/company/contact.html – Devart 2013-02-19 16:29:42

+0

@xbrady有一些奇怪之處:您已指定了OracleDbType.Long類型的兩個參數(對於table_name_id和col3列),但Oracle中的表只能有一個LONG列。 – Devart 2013-02-19 16:36:33