c# - 使用 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
解决方案
我正在处理的应用程序中有类似的东西。这应该是足够的概述,但是当您将 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
与其对应的正确值。
推荐阅读
- flask - 如何计算使用烧瓶上传文件所需的时间
- python-3.x - 嵌套 for 循环提前退出
- python-3.x - 如何将以下内容转换为 pyspark 2.4?
- swift - 在 Flutter 应用程序中使用 Realm DB 和原生 swift 代码
- oracle - 如何在存储过程中将实体或对象作为参数传递?
- mysql - 在同一个表上使用左连接的成员资格更新报告
- json - SharePoint 查找字段格式链接到列表项其引用
- javascript - 问题排序选择选项
- tensorflow - 显示训练具有大时代的模型 Tensorflow 的估计剩余时间
- ruby - Sorbet - 从泛型类继承时的具体类型