2014-01-28 25 views
0

循环我有一个数据表,看起来像这样:问题与Parameters.AddWithValue并通过数据表

[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(); 

当我进入访问,并期待在xCARRIER表,它看起来像这样:

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

当我遍历代码时,它看起来好像正在循环访问DataTable。不过,我不确定它为什么要增加第一行3次。有任何想法吗?

谢谢!

回答

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(); 
} 
+0

这样做。我在'cmd.ExecuteNonQuery'之后立即添加了它。谢谢! –