如何在c#中的access数据库中插入多个listbox项

时间:2014-03-31 19:04:25

标签: c# ms-access

我已编写此代码,但它只插入一个而不是多个项目...

for (int i = 0; i < listBox1.SelectedItems.Count; i++)   
{                  
   ad.InsertCommand = new OleDbCommand("insert into Map_Data (Material_Code,Product_Id) values(@Material_Code,@Product_Id)", con);    
   ad.InsertCommand.Parameters.Add("@Material_Code", OleDbType.Integer).Value =Convert.ToInt32(listBox1.SelectedValue);
   listBox1.Items.Remove(listBox1.SelectedItem);
   ad.InsertCommand.Parameters.Add("@Product_Id", OleDbType.Integer).Value = count;
}   
con.Open();
ad.InsertCommand.ExecuteNonQuery();  
con.Close();
MessageBox.Show("Record is successfully Save In The Database");

2 个答案:

答案 0 :(得分:2)

你的

ad.InsertCommand.ExecuteNonQuery();

需要在for循环中。

现在,它在for循环之外,因此只调用一个。 也因为它是你正在尝试的多行插入,你最好将它包装在oledb事务中以避免数据丢失/不一致..

基本上,

  1. 创建OleDbTransaction
  2. 插入所有记录。 (通过调用ExecuteNonQuery)
  3. 提交OleDbTransaction

答案 1 :(得分:0)

它只插入一行 - 最后一行 - 因为这是你调用ExecuteNonQuery的次数。如果要插入每个单行,请在con.Close();

之后立即移动结束大括号
for (int i = 0; i < listBox1.SelectedItems.Count; i++)
{

   ad.InsertCommand = new OleDbCommand("insert into Map_Data (Material_Code,Product_Id) values(@Material_Code,@Product_Id)", con);

   ad.InsertCommand.Parameters.Add("@Material_Code", OleDbType.Integer).Value =Convert.ToInt32(listBox1.SelectedValue);
   listBox1.Items.Remove(listBox1.SelectedItem);
   ad.InsertCommand.Parameters.Add("@Product_Id", OleDbType.Integer).Value = count;


   con.Open();
   ad.InsertCommand.ExecuteNonQuery();
   con.Close();
}
MessageBox.Show("Record is successfully Save In The Database");

如果您在打开连接或执行实际语句时遇到问题,可能需要添加某种try/catch块。此外,您不需要在for循环内打开/关闭连接。打开for之外的连接,然后在for block之后关闭它就足够了。但同样,我建议您添加try/catch或使用using语句。