【问题标题】:C# Windows Form using OracleDataAdapter to insert rows to a Oracle Table from a System DataTableC# Windows 窗体使用 OracleDataAdapter 从系统数据表向 Oracle 表插入行
【发布时间】:2017-04-12 22:25:10
【问题描述】:

我正在编写一个填充 DataTable 的 Windows 窗体,我希望它插入到 Oracle 表中。我在这里看到了一些使用 OracleDataAdapter 执行此操作的示例,因此我不必遍历所有记录。该代码没有任何错误,但是当我使用 Toad 检查表格时(我确实刷新了),我没有看到它。我用了下面的例子 Update and insert records into Oracle table using OracleDataAdapter from DataTable 以下是我的 DataTable 的制作方法:

    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 会将该列用作值。

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

第二次更新:

好的,我尝试循环访问参数以添加 DataTable 中的值,没有错误但仍然没有插入到数据库中。我知道我的连接字符串是正确的,因为选择查询有效。上面的代码已针对我所做的更改进行了更新。如果某位 Oracle 专家能够阐明我的问题,那么虚拟的高五正等着他们。

【问题讨论】:

    标签: c# oracle visual-studio


    【解决方案1】:

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

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

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

    • 你应该定义一个唯一的,resp。像dt.Columns["SERIAL"].Unique = true; 这样的主键列,以便生成Update()Delete()Insert()可能不需要,我不知道。

    您是否按照Data Provider for .NET Developer's Guide中的示例进行操作

    【讨论】:

      【解决方案2】:

      我终于找到了问题,DataTable中的行状态需要处于Added状态才能工作。如果其他人有这个问题,这里是我的新代码,你可以将它与我试图做的比较。谢谢 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        相关资源
        最近更新 更多