Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 德瓦特·甲骨文。插入并返回ID_Oracle_Devart - Fatal编程技术网

Oracle 德瓦特·甲骨文。插入并返回ID

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

我们正在试用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_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中的表只能有一个长列。我们最终使用了直接模式。我们不得不对代码做一些修改,但这是完全值得的。谢谢