【问题标题】:How to save multiple items in a ListView into SQL Server database?如何将 ListView 中的多个项目保存到 SQL Server 数据库中?
【发布时间】:2019-07-06 16:14:00
【问题描述】:

我的代码仅适用于第一项,但不适用于多项。我如何得到最好的帮助?

Public Sub saveItemListview(lstview As ListView)
    Try
        con = New SqlConnection(My.Settings.StockConnectionString)
        If con.State = ConnectionState.Closed Then
            con.Open()
        End If

        sql = "insert into salestb values(@items,@quantity,@price)"

        Dim cmd As SqlCommand = New SqlCommand(sql, con)

        For Each item As ListViewItem In lstview.Items
            cmd.Parameters.AddWithValue("@Items", item.Text.ToString.Trim)
            cmd.Parameters.AddWithValue("@quantity", item.SubItems(1).Text.ToString.Trim)
            cmd.Parameters.AddWithValue("@Price", item.SubItems(2).Text.ToString.Trim)
            cmd.ExecuteNonQuery()
            cmd.Dispose()
        Next

        MsgBox("Saved successfully")
        con.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Public Sub saveItemListview(lstview As ListView)
    Try
        con = New SqlConnection(My.Settings.StockConnectionString)
        If con.State = ConnectionState.Closed Then
            con.Open()
        End If

        sql = "insert into salestb values(@items,@quantity,@price)"

        Dim cmd As SqlCommand = New SqlCommand(sql, con)

        For Each item As ListViewItem In lstview.Items
            cmd.Parameters.AddWithValue("@Items", item.Text.ToString.Trim)
            cmd.Parameters.AddWithValue("@quantity", item.SubItems(1).Text.ToString.Trim)
            cmd.Parameters.AddWithValue("@Price", item.SubItems(2).Text.ToString.Trim)
            cmd.ExecuteNonQuery()
            cmd.Dispose()
        Next

        MsgBox("Save Successsfully")
        con.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

如果我尝试了多个项目,它会给出一条错误消息:

变量名“@items”已经声明。变量名称在查询批处理或存储过程中必须始终是唯一的。

【问题讨论】:

  • 很多人滥用ListView 控件。不要将其用作网格。它不是一个。您应该使用 DataGridView 并且应该将 DataTable 绑定到它。然后,您可以通过对数据适配器上的Update 的一次调用来保存所有数据。您可以通过调用FillFillSchema 填充DataTable 或仅使用数据适配器构建模式。
  • 您需要在再次添加参数之前调用cmd.Parameters.Clear。但更好的选择是在循环外使用虚拟值创建参数,并在循环内使用实际数据设置 Value 属性
  • @Steve,不需要虚拟值。您只需创建没有值的参数,通过调用Add 而不是AddWithValue 来完成。 AddWithValue 无论如何都是个坏主意,因为它可以推断出不适当的数据类型。
  • @Steve,我添加了 cmd.parameters.Clear 并为我工作

标签: sql sql-server vb.net


【解决方案1】:
Public Sub saveItemListview(lstview As ListView)
    Try
        con = New SqlConnection(My.Settings.StockConnectionString)
        If con.State = ConnectionState.Closed Then
            con.Open()
        End If

        sql = "insert into salestb values(@items,@quantity,@price)"

        Dim cmd As SqlCommand = New SqlCommand(sql, con)

        For Each item As ListViewItem In lstview.Items
            cmd.Parameters.AddWithValue("@Items", item.Text.ToString.Trim)
            cmd.Parameters.AddWithValue("@quantity", item.SubItems(1).Text.ToString.Trim)
            cmd.Parameters.AddWithValue("@Price", item.SubItems(2).Text.ToString.Trim)
            cmd.ExecuteNonQuery()
            cmd.Dispose()
            cmd.Parameter.clear()
        Next

        MsgBox("Save Successsfully")
        con.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

【讨论】:

  • 欢迎来到 SO!纯代码答案通常不是很有帮助。请编辑您的帖子,添加一段将代码与问题相关联的段落,解释您做了什么以及为什么这样做,到目前为止这是一个解决方案。
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2017-03-30
  • 2011-05-02
  • 1970-01-01
相关资源
最近更新 更多