2013-02-11 47 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