使用DataTable中的OracleDataAdapter更新记录并将其插入Oracle表中
本文关键字:插入 Oracle 表中 新记录 DataTable 中的 OracleDataAdapter 更新 使用 | 更新日期: 2023-09-27 17:58:01
一个新手向c#提出的问题,并对其长度表示歉意。我有以下场景。我有一个小型控制台应用程序,它通过连接到外部系统来填充数据表,然后需要更新现有记录并将新记录插入到oracle表中。数据表中的列与oracle表列的名称不同,顺序也不同。我在这里读到了另一篇类似场景的文章(从文件加载到表中),其中提到使用OracleDataAdapter进行更新/插入是可行的。简化的数据表和oracle表是
DataTable table = new DataTable();
table.Columns.Add("Product", typeof(String));
table.Columns.Add("Price", typeof(double));
table.Columns.Add("Effective_Date", typeof(DateTime));
//sample data
table.Rows.Add("abcd", 1.011, DateTime.Today);
table.Rows.Add("efg", 1.00, DateTime.Today);
table.Rows.Add("hijk", 20, DateTime.Today);
oracle表具有结构
ITEM VARCHAR2(20 BYTE) NOT NULL ENABLE,
EFF_DATE DATE,
VALUE NUMBER
我尝试了以下代码来使用数据表和适配器来更新oracle表,但我缺少了一些东西。我也在想我是不是找错树了。我看到的大多数使用数据适配器的示例首先从表中进行选择,然后将结果放入网格中,用户可以在其中添加、更新、插入或删除记录,然后使用数据适配器更新表。在我的情况下,我想知道我是否能让它工作,如果数据表中的所有记录都将被视为插入,因为数据表和oracle表之间没有连接。
我正在使用Oracle。ManagedDataAccess。客户端连接并进行更新
public static void UpdateOrSaveItems(DataTable dt)
{
String insert_statement, update_statement, select_statement;
select_statement = "SELECT * from items";
insert_statement = "INSERT INTO items (item, eff_date, value) values (:pInsItem,:pInsEffDate,:pInsValue)";
update_statement = "UPDATE items set eff_date = :pUpdEffDate, value = :pUpdValue where item = :pUpdItem";
using (OracleConnection conn = theDatabase.ConnectToDatabase())
{
using (OracleDataAdapter oraAdapter = new OracleDataAdapter(select_statement, conn))
{
//build update/insert commands and parameters
oraAdapter.UpdateCommand = new OracleCommand(update_statement, conn);
oraAdapter.InsertCommand = new OracleCommand(insert_statement, conn);
oraAdapter.UpdateCommand.BindByName = true;
oraAdapter.InsertCommand.BindByName = true;
OracleParameter pUpdItem = new OracleParameter("pUpdItem", OracleDbType.Varchar2);
pUpdItem.SourceColumn = dt.Columns[0].ColumnName;
OracleParameter pUpdEffDate = new OracleParameter("pUpdEffDate", OracleDbType.Date);
pUpdEffDate.SourceColumn = dt.Columns[2].ColumnName;
OracleParameter pUpdValue = new OracleParameter("pUpdValue", OracleDbType.Double);
pUpdValue.SourceColumn = dt.Columns[1].ColumnName;
OracleParameter pInsItem = new OracleParameter("pInsItem", OracleDbType.Varchar2);
pUpdItem.SourceColumn = dt.Columns[0].ColumnName;
OracleParameter pInsEffDate = new OracleParameter("pInsEffDate", OracleDbType.Date);
pInsEffDate.SourceColumn = dt.Columns[2].ColumnName;
OracleParameter pInsValue = new OracleParameter("pInsValue", OracleDbType.Double);
pInsValue.SourceColumn = dt.Columns[1].ColumnName; oraAdapter.UpdateCommand.Parameters.Add(pUpdItem);
oraAdapter.UpdateCommand.Parameters.Add(pUpdEffDate);
oraAdapter.UpdateCommand.Parameters.Add(pUpdValue);
oraAdapter.InsertCommand.Parameters.Add(pInsItem);
oraAdapter.InsertCommand.Parameters.Add(pInsEffDate);
oraAdapter.InsertCommand.Parameters.Add(pInsValue);
oraAdapter.Update(dt);
}
}
}
当我运行这个时,我得到一个错误,我不能在定义为键的列中插入null。在数据表中,它们都不是null。我不知道数据在哪里,但不确定它是什么。我还想知道这是否是做这类事情的正确方法。我想避开
loop through datatable
select to see if record is in oracle table
if in table update else insert
因为唱片的数量可能有几十万张,而且不确定演出会是什么样子。
是否正在初始化要传入的DataTable对象的ColumnName属性?否则,它们可能读取为null。
例如
public static void Main()
{
Datatable myDataTable = new DataTable();
myDataTable.Columns = new Columns[3];
myDataTable.Columns[0].ColumnName = "Employees";
myDataTable.Columns[1].ColumnName = "Salary";
myDataTable.Columns[2].ColumnName = "Department";
UpdateOrSaveItems(myDataTable);
}
我发现了错误。我没有在其中一个插入参数上设置源列。我在pUdpItem上设置了两次源列,而不是为pUdptem和pInsItem 设置它