【问题标题】:Issue with Parameters.AddWithValue and looping through DataTableParameters.AddWithValue 和循环数据表的问题
【发布时间】:2014-01-28 18:08:23
【问题描述】:

我有一个如下所示的 DataTable:

[0]    [1]
"Z12"  "Company A"
"A32"  "Company B"
"K54"  "Company C"

我正在尝试遍历行,并使用以下代码将它们添加到 Access 表中:

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\myDB.accdb");

OleDbCommand cmd = new OleDbCommand();

cmd.Connection = myConnection;
cmd.CommandType = CommandType.Text;

myConnection.Open();

for (int i = 0; i <= dt.Rows.Count - 1; i++)
    {
        cmd.CommandText = "INSERT INTO xCARRIER (CARRIER_ID, CARRIER_NAME) VALUES (@p1, @p2)";

        cmd.Parameters.AddWithValue("@p1", dt.Rows[i].ItemArray.GetValue(0));
        cmd.Parameters.AddWithValue("@p2", dt.Rows[i].ItemArray.GetValue(1));

        cmd.ExecuteNonQuery();
    }

myConnection.Close();

当我进入 Access 并查看 xCARRIER 表时,它看起来像这样:

"Z12"  "Company A"
"Z12"  "Company A"
"Z12"  "Company A"

当我单步执行代码时,看起来它正在正确地循环遍历 DataTable。不过,我不确定为什么要添加第一行 3 次。有什么想法吗?

谢谢!

【问题讨论】:

    标签: c# datatable


    【解决方案1】:

    您可以在每次迭代后清除命令参数:

     command.Parameters.Clear();
    

    所以你的代码应该是这样的:

    OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\myDB.accdb");
    
    OleDbCommand cmd = new OleDbCommand();
    
    cmd.Connection = myConnection;
    cmd.CommandType = CommandType.Text;
    
    myConnection.Open();
    
    for (int i = 0; i <= dt.Rows.Count - 1; i++)
    {
        cmd.Parameters.Clear(); 
        cmd.CommandText = "INSERT INTO xCARRIER (CARRIER_ID, CARRIER_NAME) VALUES (@p1, @p2)";
    
        cmd.Parameters.AddWithValue("@p1", dt.Rows[i].ItemArray.GetValue(0));
        cmd.Parameters.AddWithValue("@p2", dt.Rows[i].ItemArray.GetValue(1));
    
        cmd.ExecuteNonQuery();
    }
    
    myConnection.Close();
    

    或者干脆更新之前的参数值:

    for (int i = 0; i <= dt.Rows.Count - 1; i++)
    {
        cmd.CommandText = "INSERT INTO xCARRIER (CARRIER_ID, CARRIER_NAME) VALUES (@p1, @p2)";
    
        cmd.Parameters.AddWithValue["@p1"] = dt.Rows[i].ItemArray.GetValue(0));
        cmd.Parameters.AddWithValue["@p2"] = dt.Rows[i].ItemArray.GetValue(1));
    
        cmd.ExecuteNonQuery();
    }
    

    【讨论】:

    • 做到了。我在cmd.ExecuteNonQuery 之后立即添加了它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多