我正在尝试使用此代码插入oracle表,并发出以下错误消息:“该值不在预期范围内。”
我尝试了不同的方法,但始终会抛出相同的错误。
oc.Open();
OracleDataAdapter oda = new OracleDataAdapter();
OracleCommand cmd = new OracleCommand("INSERT INTO MYTABLE (ROW_ID, CREATED, STATUS) " +
"VALUES (:pROW_ID, :pCREATED, :pSTATUS", oc);
OracleParameter ROW_ID = new OracleParameter("pROW_ID", OracleDbType.Varchar2, 15, "ROW_ID");
OracleParameter CREATED = new OracleParameter("pCREATED", OracleDbType.Date, 30, "CREATED");
OracleParameter STATUS = new OracleParameter("pASIGNADO", OracleDbType.Varchar2, 15, "STATUS");
ROW_ID.Value = BDOracleObtenerRowIDBackOffice();
ROW_ID.Value = = "146721030020001";
CREATED.Value = "SYSDATE";
STATUS.Value = "ON_HOLD";
cmd.Parameters.Add("pROW_ID", ROW_ID); //<-- Here throws exception
cmd.Parameters.Add("pCREATED", CREATED);
cmd.Parameters.Add("pSTATUS", STATUS);
oda.InsertCommand = cmd;
追踪: 在Oracle.ManagedDataAccess.Client.OracleParameter..ctor(String parameterName,Object obj) 在Oracle.ManagedDataAccess.Client.OracleParameterCollection.Add(字符串名称,对象值) 在C:\ Users \ user_01 \ source \ repos \ file.cs:línea2945处的TestCore.MyClass.functionInsert(String param)
答案 0 :(得分:2)
我正在处理的应用程序中有类似的内容。这只是一个概述,但在将Oracle参数添加到cmd
时,您可能想根据我的需要更改参数名称和值。
using(var conn = new OracleConnection("CONNECTIONSTRING")
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO MYTABLE (ROW_ID, CREATED, STATUS) VALUES (:pROW_ID, :pCREATED, :pSTATUS");
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(":pROW_ID", OracleDbType.whateverType, "146721030020001", ParameterDirection.Input);
cmd.Parameters.Add(":pCREATED", OracleDbType.whateverType, "SYSDATE", ParameterDirection.Input);
cmd.Parameters.Add(":pASIGNADO", OracleDbType.whateverType, "ON_HOLD", ParameterDirection.Input);
cmd.ExecuteNonQuery();
conn.Close();
}
注意:如果ROW_ID是PK并具有自动生成值的序列,则需要使用与其关联的序列,而不是传递参数:
cmd.CommandText = "INSERT INTO MYTABLE (ROW_ID, CREATED, STATUS) VALUES (NAME_OF_SEQUENCE.nextval, :pCREATED, :pSTATUS");
另一个注意事项:如果您要批量插入而不是单行插入,我强烈建议使用数组绑定:http://burnignorance.com/database-tips-and-tricks/bulk-copy-with-oracle-using-array-binding/,对于较大的数据集,性能非常出色。
关于"The value is not within the expected range."
,请对照数据库中的列再次检查该值以确保其有效,然后使用与其对应的正确的OracleDbType
。