如何使用c在mssqlserver中插入多行listview
本文关键字:插入 listview mssqlserver 何使用 | 更新日期: 2023-09-27 18:22:04
这段代码正在运行,但我认为缺少了一些东西,因为它只有在一次添加一行的情况下才能运行。如何一次存储多行?
foreach (ListViewItem item in listView1.Items)
{
for (int i = 0; i < listView1.Items.Count; i++)
{
SqlConnection con = new SqlConnection("Data Source=ZON-PC;Initial Catalog=RestaurantPOSSOC;Integrated Security=True");
con.Open();
SqlCommand _sqlcommand = new SqlCommand("insert into OrderInfo (ProductName,Quantity,Price)values('" + listView1.Items[i].SubItems[0].Text + "','" + listView1.Items[i].SubItems[1].Text + "','" + listView1.Items[i].SubItems[2].Text + "')", con);
SqlDataReader _sqldatareader = _sqlcommand.ExecuteReader();
_sqldatareader.Read();
con.Close();
}
}
我会为您的例程更改以下几点:
- 正如gmiley所评论的,您不需要foreach循环和for循环,而是通过这种方式进行n*n次插入
- 连接可能很昂贵,我会在foreach循环之外创建连接
- 当我进行更新时,我使用SqlCommand.ExecuteNonQuery,而不是SqlCommand.EexecuteReader(),因为我实际上不希望返回任何行
所以在伪代码中:
using (connection = new(...))
con.open
foreach(item)
command = new command()
command.ExecuteNonQuery()
con.close
查看此处
基本上:INSERT INTO表(第1列,第2列)VALUES(值1,值2),(值1、值2)
不是一个答案,但您确实应该将您的起始代码至少更改为:
SqlConnection con = new SqlConnection("Data Source=ZON-PC;Initial Catalog=RestaurantPOSSOC;Integrated Security=True");
con.Open();
foreach (ListViewItem item in listView1.Items)
{
SqlCommand _sqlcommand = new SqlCommand("insert into OrderInfo (ProductName,Quantity,Price)values('" + item.SubItems[0].Text + "','" + item.SubItems[1].Text + "','" + item.SubItems[2].Text + "')", con);
SqlDataReader _sqldatareader = _sqlcommand.ExecuteReader();
_sqldatareader.Read();
}
con.Close();
您还需要参数化查询并添加一些异常处理。
首先:无论使用什么方法,都需要清理外部资源。SqlConnection
和SqlCommand
对象都有一个.Dispose()
方法,应该在using()
构造/宏中使用。using同时处理.Dispose()
和基本的try/finaly,以确保即使发生错误,也能调用.Dispose()
方法。
第二:如果您使用的是SQL Server 2008或更新版本,您应该检查表值参数(TVP),因为它们将消除SQL注入问题并提高性能。
我在以下答案中有这样做的例子:
-
通行证字典<字符串,int>到存储过程T-SQL
-
如何在最短的时间内插入1000万条记录?
在点击按钮或任何按钮下添加此项,在此之前您应该打开SqlConnection
conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString);
foreach (ListViewItem item in lvPOItem.Items)
{
SqlCommand cmd = new SqlCommand("INSERT INTO PurchasePOItems (PO_ItemName, PO_Specs, PO_PONumber)values(@PO_ItemName, @PO_Specs,@PO_PONumber)", conn);
conn.Open();
cmd.Parameters.AddWithValue("@PO_ItemName", item.SubItems[0].Text);
cmd.Parameters.AddWithValue("@PO_Specs", item.SubItems[1].Text);
cmd.Parameters.AddWithValue("@PO_PONumber", cbPurchaseOrderNo.Text);
cmd.ExecuteNonQuery();
conn.Close();
}