首页 > 解决方案 > 使用 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(String name, Object val) 在 TestCore.MyClass.functionInsert(String param) 在 C: \Users\user_01\source\repos\file.cs:linea 2945

标签: c#oracle

解决方案


我正在处理的应用程序中有类似的东西。这应该是足够的概述,但是当您将 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与其对应的正确值。


推荐阅读