如何使用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();
    }
}

如何使用c在mssqlserver中插入多行listview

我会为您的例程更改以下几点:

  1. 正如gmiley所评论的,您不需要foreach循环和for循环,而是通过这种方式进行n*n次插入
  2. 连接可能很昂贵,我会在foreach循环之外创建连接
  3. 当我进行更新时,我使用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();

您还需要参数化查询并添加一些异常处理。

首先:无论使用什么方法,都需要清理外部资源。SqlConnectionSqlCommand对象都有一个.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();
}