我們正在嘗試使用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。
此外,查詢運行良好,如果我刪除輸出參數和查詢中的返回行。
我發生了兩種可能性。使用命名參數有時無法按預期工作,並且必須按正確的順序給它們 - 所以將輸出參數移動到數組的末尾可能會有所幫助。但是更可能的是,從[this](http://www.devart.com/dotconnect/oracle/articles/parameters.html)看起來也許你不應該在第一個參數的'OracleParameter'中冒號?不是我用過的東西,儘管如此猜測真的... – 2013-02-11 22:22:44
@AlexPoole感謝您的想法。我嘗試按順序添加參數並收到相同的錯誤。我認爲按命名綁定並不重要?我還嘗試在創建參數時刪除冒號,但仍收到錯誤消息。有趣的是,我們有數以百計的其他查詢都以相同的方式創建了這些參數,並且它們似乎都起作用。只是這個查詢中有RETURNING關鍵字。 – xbrady 2013-02-12 00:05:07
順序應該不重要,但我看到它不起作用(現在無法找到鏈接)。無論如何,這不是問題。對不起,我忍不住了! – 2013-02-12 10:12:36