我是vb.net 2008和SQL Server 2005的新手。我想在vb.net中点击一下插入按钮,从checkedlistbox
插入多个选中的复选框值。
任何人都可以告诉我如何做到这一点吗?
我的代码是:
Dim Checkeditems As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
cmd.CommandText = ("Insert into Modules where Module_Name=@Module_Name")
cmd.Connection = cn
cn.Open()
For Each Checkeditem In CheckedListBox1.SelectedValue.ToString
cmd.Parameters.AddWithValue("@Module_Name", Checkeditem)
Next
MsgBox("inserted", MsgBoxStyle.OkOnly)
cn.Close()
End Sub
这就是我填写CheckedListBox的方法
qry = "Select Module_ID,Module_Name from Modules"
da = New SqlDataAdapter(qry, cn)
ds = New DataSet()
da.Fill(ds, "tab")
CheckedListBox1.DataSource = ds.Tables("tab")
CheckedListBox1.DisplayMember = "Module_Name"
CheckedListBox1.ValueMember = "Module_ID"
CheckedListBox1.Text = ""
答案 0 :(得分:2)
你必须纠正的第一件事是,Insert
命令允许它们不存在条件。
如果您想在单个查询中插入多行,则意味着您要refer this link或尝试以下操作,
Dim sql as String="Insert into Modules (Module_Nam) VALUES "
For Each itemChecked In CheckedListBox1.CheckedItems
sql & = "('" & itemChecked.ToString & "'),"
Next
cmd.CommandText = sql.SubString(0,Len(sql)-1) '<-- avoid an additional comma
cmd.Connection = cn
cn.Open()
cmd.ExecuteNonQuery()
MsgBox("inserted", MsgBoxStyle.OkOnly)
cn.Close()
答案 1 :(得分:1)
来自Neethu Soman的答案正在引导您朝着正确的方向前进,但包含一些错误和一些效率低下的问题。
第一点:如果清单中有许多元素,最好使用StringBuilder
类来避免过多的字符串连接。
第二点:您应该遍历CheckedIndices属性以检索要插入的Item文本,以避免对所有项目进行不必要的循环。
Dim sql = new StringBuilder("Insert into Modules (Module_Nam) VALUES ")
For Each c In CheckedListBox1.CheckedIndices
Dim value = CheckedListBox1.Items(c).ToString
sql.Append("('" & value & "'),"
Next
sql.Length -= 1 ' Remove the last comma '
cmd.CommandText = sql.ToString()
cmd.Connection = cn
cn.Open()
Dim rowsInserted = cmd.ExecuteNonQuery()
MsgBox("inserted " & rowsInserted & " rows", MsgBoxStyle.OkOnly)
cn.Close()
修改强>
从下面的评论中,CheckedListBox中的每个项目都是DataRowView
,当您想要返回已检查的值时,您需要使用DataRowView对象
Dim sql = new StringBuilder("Insert into Modules (Module_Name) VALUES ")
For Each c In CheckedListBox1.CheckedIndices
Dim rowView As DataRowView = CheckedListBox1.Items(c)
Dim value = rowView("Module_Name").ToString()
sql.Append("('" & value & "'),"
Next
sql.Length -= 1 ' Remove the last comma '
cmd.CommandText = sql.ToString()
cmd.Connection = cn
cn.Open()
Dim rowsInserted = cmd.ExecuteNonQuery()
MsgBox("inserted " & rowsInserted & " rows", MsgBoxStyle.OkOnly)
cn.Close()
这将修复读回已检查值的错误,但我对您的代码感到有点困惑。您有一个名为Modules的表,您可以读取模块的ID和名称。然后你编写的代码再次INSERT在同一个表中的模块名称?您最终在该表中使用了重复的模块名称(如果Module_Name不是该表中的唯一索引)。这真的是你想要做的吗?