德瓦特甲骨文。插入并返回 ID
Posted
技术标签:
【中文标题】德瓦特甲骨文。插入并返回 ID【英文标题】:Devart Oracle. Insert and returning ID 【发布时间】:2013-02-11 18:05:13 【问题描述】:我们正在试用 Devart Oracle 适配器,但在使用 Oracle 的 DataAccess DLL 的现有代码时遇到了问题。我们在command.ExecuteNonQuery()
上收到以下示例错误:
ORA-01400: 无法将 NULL 插入 ("DatabaseName"."table_name"."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 看起来你不应该在OracleParameter
的第一个参数中使用冒号?虽然不是我用过的东西,但我真的很猜测......
@AlexPoole 感谢您的想法。我尝试按顺序添加参数并收到相同的错误。我认为按名称绑定时顺序无关紧要?我还尝试在创建参数时删除冒号,但仍然收到错误。有趣的是,我们有数百个其他查询具有以相同方式创建的参数,并且它们似乎都有效。只是这一个查询中包含 RETURNING 关键字。
顺序无关紧要,但我发现它不起作用(现在找不到链接)。反正不是这里的问题。对不起,我帮不上忙!
【参考方案1】:
感谢您的报告。我们已重现该问题并正在对其进行调查。作为一种解决方法,请切换到直接模式:http://www.devart.com/dotconnect/oracle/docs/?directmode.html。
【讨论】:
谢谢,很遗憾我们无法在我们的网络上使用直接模式。作为一种解决方法,我们只是将其更改为两个查询。一个用于选择序列 nextval,另一个用于插入。在你们能够解决问题之前,这将正常工作。 @xbrady 请将您的表格的 DDL 脚本发送到我们的支持地址:devart.com/company/contact.html @xbrady 有点奇怪:您指定了两个 OracleDbType.Long 类型的参数(用于 table_name_id 和 col3 列)但是 Oracle 中的表只能有一个 LONG 列。 我们最终使用了直接模式。我们必须对我们的代码进行一些修改,但这完全值得。谢谢。以上是关于德瓦特甲骨文。插入并返回 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 for 循环中的异常以使用存储过程插入行?甲骨文 PLSQL