【发布时间】: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的一次调用来保存所有数据。您可以通过调用Fill或FillSchema填充DataTable或仅使用数据适配器构建模式。 -
您需要在再次添加参数之前调用cmd.Parameters.Clear。但更好的选择是在循环外使用虚拟值创建参数,并在循环内使用实际数据设置 Value 属性
-
@Steve,不需要虚拟值。您只需创建没有值的参数,通过调用
Add而不是AddWithValue来完成。AddWithValue无论如何都是个坏主意,因为它可以推断出不适当的数据类型。 -
@Steve,我添加了 cmd.parameters.Clear 并为我工作
标签: sql sql-server vb.net