0

我一直在绞尽脑汁想弄清楚为什么我的代码不起作用。我正在尝试从填充了来自访问数据库的数据的 DataSet 中读取数据,并将数据插入到之前创建的 Oracle 数据库中。当我尝试以下代码时,它不起作用,虽然我使用了 try 和 catch 块,但在调试时它会冻结并且不会显示任何错误。如果可以看到我已经注释掉了我的 foreach 循环正上方的块..效果很好,非常感谢您的任何帮助:

     private void button3_Click(object sender, EventArgs e)
    {
        string query1 = "Select * from Test;";
        string StrQuery= "Insert Into TEST (ID, DATA) Values (:ID, :DATA)";

        Conn = new OleDbConnection(connStr);
        Conn.Open();
        using (OleDbConnection connection1 = new OleDbConnection(connStr))
        {
            using (OleDbDataAdapter adapter1 = new OleDbDataAdapter(query1, connection1))
            {
                DataSet ds1 = new DataSet();
                adapter1.Fill(ds1);
               // no need for refilling DataGridView1.DataSource = ds.Tables[0]

               // insterting the dataset into oracle
                try
                {
                    using (OracleConnection connect = new OracleConnection(oradb1))
                    {
                        connect.Open();
                        using (OracleCommand comma = new OracleCommand(StrQuery, connect))
                        {


                                /*comma.Parameters.Add(new OracleParameter(":ID", 2));
                                comma.Parameters.Add(new OracleParameter(":DATA", 2));
                                comma.ExecuteNonQuery();*/
                            foreach (DataRow drRow in ds1.Tables[0].Rows)
                            {
                                for (int i = 0; i < ds1.Tables[0].Columns.Count; i++)
                                {
                                    comma.Parameters.Add(new OracleParameter(":ID", drRow[i]));
                                    comma.Parameters.Add(new OracleParameter(":DATA", drRow[i]));
                                    comma.ExecuteNonQuery();
                                }
                            }


                            connect.Close();
                            connect.Dispose();
                        }
                    }

                }

                catch (OracleException)
                {
                    System.Diagnostics.Debugger.Break();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

            }
        }

        Conn.Close();
    }
4

3 回答 3

1

您正在循环列,但将 drRow[i] 添加为参数中的值。我不认为这是你的意图。

跳过列循环并将第一列值添加到 id 并将第二列值添加到数据。那应该是您想要的……如果不是,请再描述一下……

于 2013-07-22T16:12:03.850 回答
0

我在此处的回答中概述了类似的方法。在这种特殊情况下,我将数据从 SQL Server Compact 移动到 Access,但同样的想法也可以很好地用于在任意两个 OleDb 数据源之间移动数据。

它使用 anOleDbDataAdapter将源表拉入 a DataTable,将其复制到另一个DataTable,然后使用 anotherOleDbDataAdapter更新目标数据库中的相应表。

于 2013-10-28T08:34:26.763 回答
0

扩展 Judgemaik 的答案,我相信你需要做这样的事情(不能真正告诉你访问表中列的名称是什么,但你明白了:

foreach (DataRow drRow in ds1.Tables[0].Rows)
{
    comma.Parameters.Add(new OracleParameter(":ID", drRow["IDColumnFromAccessDB"]));
    comma.Parameters.Add(new OracleParameter(":DATA", drRow["DATAColumnFromAccessDB"]));
    comma.ExecuteNonQuery();
}
于 2013-07-22T16:17:47.013 回答