C# Windows 窗体使用 OracleDataAdapter 将行从系统数据表插入到 Oracle 表中



我正在编写一个填充DataTable的Windows表单,我希望它插入到Oracle Table中。 我在这里看到了一些使用 OracleDataAdapter 来执行此操作的示例,因此我不必遍历所有记录。 代码没有任何错误,但是当我使用 Toad 检查表时(我确实刷新了),我没有看到它。 我使用了下面的示例 使用 OracleDataAdapter 从 DataTable 更新记录并将其插入到 Oracle 表中 以下是我的数据表的制作方式:

public DataTable dtMain = new DataTable();
public void FillTable(DataTable dt)
{
dtMain.Columns.Add("SERIAL", typeof(System.String));
dtMain.Columns.Add("LOCATION", typeof(System.String));
dtMain.Columns.Add("UPC", typeof(System.String));
dtMain.Columns.Add("PRODUCT", typeof(System.String));
dtMain.Columns.Add("CREATED_BY", typeof(System.String));
dtMain.Columns.Add("CREATED_DATE", typeof(System.DateTime));
dtMain.Columns.Add("SKU", typeof(System.String));
dtMain.Columns.Add("MAN_DATE", typeof(System.DateTime));
dtUpload.Columns[0].Unique = true;
dtMain.Merge(dt);
}

这就是我尝试插入数据库的方式

private void btnUpload_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
string strSelect = "SELECT serial, upc, man_date, location, product, created_by, created_date, serial from schema.table where rownum < 2";
string strInsert = "INSERT INTO schema.table (serial, upc, man_date, location, product, created_by, created_date, serial) VALUES (:serial, :upc, :man_date, :location, :product, :created_by, :created_date, :serial)";
string conStr = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
OracleConnection connection = new OracleConnection(conStr);
connection.Open();
if (connection.State != ConnectionState.Open)
{
return;
}
try
{
OracleDataAdapter adapterS = new OracleDataAdapter();
adapterS.SelectCommand = new OracleCommand(strSelect, connection);
adapterS.Fill(dt);
dt.Rows.Remove(dt.Rows[0]);
dt.Merge(dtUpload);
}
catch (Exception ex)
{
string x = ex.Message + ex.StackTrace;
throw;
}
for (int i = 0; dt.Rows.Count > i; i++)
{
OracleDataAdapter adapter = new OracleDataAdapter();
adapter.InsertCommand = new OracleCommand(strInsert, connection);
adapter.InsertCommand.BindByName = true;
OracleParameter pSerial = new OracleParameter(":serial", OracleDbType.Varchar2);
pSerial.SourceColumn = dt.Columns[0].ColumnName;
pSerial.Value = dtUpload.Rows[i][0];
OracleParameter pLocation = new OracleParameter(":location", OracleDbType.Varchar2);
pLocation.SourceColumn = dt.Columns[1].ColumnName;
pLocation.Value = dtUpload.Rows[i][1];
OracleParameter pUPC = new OracleParameter(":upc", OracleDbType.Date);
pUPC.SourceColumn = dt.Columns[2].ColumnName;
pUPC.Value = dtUpload.Rows[i][2];
OracleParameter pProduct = new OracleParameter(":product", OracleDbType.Varchar2);
pProduct.SourceColumn = dt.Columns[3].ColumnName;
pProduct.Value = dtUpload.Rows[i][3];
OracleParameter pCreatedBy = new OracleParameter(":created_by", OracleDbType.Varchar2);
pCreatedBy.SourceColumn = dt.Columns[4].ColumnName;
pCreatedBy.Value = dtUpload.Rows[i][4];
OracleParameter pCreatedDate = new OracleParameter(":created_date", OracleDbType.Varchar2);
pCreatedDate.SourceColumn = dt.Columns[5].ColumnName;
pCreatedDate.Value = dtUpload.Rows[i][5];
OracleParameter pSKU = new OracleParameter(":SKU", OracleDbType.Date);
pSKU.SourceColumn = dt.Columns[6].ColumnName;
pSKU.Value = dtUpload.Rows[i][6];
OracleParameter pManDate = new OracleParameter(":man_date", OracleDbType.Varchar2);
pManDate.SourceColumn = dt.Columns[7].ColumnName;
pManDate.Value = dtUpload.Rows[i][7];
adapter.InsertCommand.Parameters.Add(pSerial);
adapter.InsertCommand.Parameters.Add(pLocation);
adapter.InsertCommand.Parameters.Add(pUPC);
adapter.InsertCommand.Parameters.Add(pProduct);
adapter.InsertCommand.Parameters.Add(pCreatedBy);
adapter.InsertCommand.Parameters.Add(pCreatedDate);
adapter.InsertCommand.Parameters.Add(pserial);
adapter.InsertCommand.Parameters.Add(pManDate);
}
try
{
adapter.Update(dt);
}
catch (Exception ex)
{
string x = ex.Message + ex.StackTrace;
throw;
}
connection.Close();
connection.Dispose();

}

如果有人能给我一些指示,那就太好了,我已经在谷歌上搜索了 2 天,我只是想不通。 我敢打赌这是一件简单的事情

更新:

感谢您的回复,我花了一点时间才回到这个项目。 当我发布这个时,我没有意识到我忘记包含我的选择声明。

对于 OracleParameter 值,我认为使用 SourceColumn 会将该列用于值。

我确实更新了数据表,序列是唯一的。 它仍然不插入数据。 如果我包含参数值,我会逐行循环来执行此操作吗? 上面我用当前代码更正/更新了它。

第二次更新:

好的,我尝试遍历参数以添加数据表中的值,没有错误,但仍然没有插入到数据库中。 我知道我的连接字符串是正确的,因为选择查询有效。 上面的代码已针对我所做的更改进行了更新。 如果一些甲骨文大师能阐明我的问题,一个虚拟的击掌正在等着他们。

我从未使用过OracleDataAdapter但我看到了这些可能的问题:

  • 我认为您不能立即使用OracleDataAdapter,首先您必须从 Oracle 选择一个现有表,然后根据此结果对其进行更新/插入/删除。你的strSelect字符串在哪里?我看不出来。

  • 您创建了所有OracleParameter但我没有看到您为其分配任何值,它们都是空的。在您进行任何插入之前,我希望像pOptoroLP.Value = ...;这样的东西。

  • 您应该定义一个唯一的主键列,如dt.Columns["SERIAL"].Unique = true;以便Update()Delete()。也许Insert()不需要,我不知道。

是否遵循了 .NET 数据提供程序开发人员指南中的示例

我终于发现了问题,DataTable 中的行状态需要处于 Add 状态才能正常工作。 如果其他人有这个问题,这是我的新代码,您可以将其与我尝试做的事情进行比较。 谢谢 Wernfried Domscheit 的 Oracle 部分,但事实证明是我的 DataTable 是问题所在,尽管设置 Unique 列也可能是一个问题,我没有检查。 OracleCommandBuilder为我处理了插入语句和参数。

private void btnUpload_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
string strSelect = "SELECT serial, upc, man_date, location, product, created_by, created_date, serial from schema.table where rownum < 2";
string strInsert = "INSERT INTO schema.table (serial, upc, man_date, location, product, created_by, created_date, serial) VALUES (:serial, :upc, :man_date, :location, :product, :created_by, :created_date, :serial)";
string conStr = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
OracleConnection connection = new OracleConnection(conStr);
connection.Open();
if (connection.State != ConnectionState.Open)
{
return;
}
OracleDataAdapter adapter = new OracleDataAdapter(strSelect, conStr);
OracleCommandBuilder builder = new OracleCommandBuilder(adapter);
adapter.Fill(dt);
dt.Columns["SERIAL"].Unique = true;
dt.Merge(dtUpload);
dt.Rows.Remove(dt.Rows[0]);
foreach (DataRow row in dt.Rows)
{
row.SetAdded();
}
try
{
adapter.Update(dt);
}
catch (Exception ex)
{
string x = ex.Message + ex.StackTrace;
throw;
}
finally
{
connection.Close();
connection.Dispose();
}
}

最新更新