Oracle 德瓦特·甲骨文。插入并返回ID
我们正在试用Devart Oracle适配器,但与Oracle的DataAccess DLL一起使用的现有代码存在问题。我们在Oracle 德瓦特·甲骨文。插入并返回ID,oracle,devart,Oracle,Devart,我们正在试用Devart Oracle适配器,但与Oracle的DataAccess DLL一起使用的现有代码存在问题。我们在command.ExecuteNonQuery()上得到以下示例错误: ORA-01400:无法将NULL插入到 (“数据库名”“表名”“col3”) 下面是一些示例代码: const string query = @"INSERT INTO table_name (table_name_id, col1, col2, col3) VALUES(table_nam
command.ExecuteNonQuery()
上得到以下示例错误:
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
另外,如果我删除查询中的输出参数和返回行,查询运行良好。谢谢您的报告。我们复制了这个问题,并正在调查它。作为解决方法,请切换到直接模式:。我有两种可能。使用命名参数有时不能像预期的那样工作,您必须以正确的顺序提供它们-因此将输出参数移动到数组的末尾可能会有所不同。但是更可能的是,从它看来,您不应该在
OracleParameter
的第一个参数中使用冒号?不是我用过的东西,所以我真的在猜测…@AlexPoole谢谢你的建议。我尝试按顺序添加参数,但收到了相同的错误。我以为按名字绑定时顺序并不重要?我还尝试在创建参数时删除冒号,但仍然收到错误。有趣的是,我们还有数百个其他查询,它们的参数都是以同样的方式创建的,而且它们似乎都能工作。只是这一个查询中有返回关键字。顺序应该不重要,但我看到它不起作用(现在找不到链接)。无论如何,这不是问题所在。对不起,我帮不上忙!谢谢,很遗憾,我们无法在网络上使用直接模式。作为一种解决方法,我们只是将其更改为两个查询。一个用于选择序列nextval,另一个用于执行插入。在你们能够解决这个问题之前,这一切都会很好。@xbrady请将您表的DDL脚本发送到我们的支持地址:@xbrady有点奇怪:您指定了OracleDbType.Long类型的两个参数(用于表名和col3列),但Oracle中的表只能有一个长列。我们最终使用了直接模式。我们不得不对代码做一些修改,但这是完全值得的。谢谢