使用C#插入Oracle Data Acces

时间:2019-03-28 15:52:45

标签: c# oracle

我正在尝试使用此代码插入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)

1 个答案:

答案 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