将CheckedListBox中的> 1选中的复选框值插入SQL Server

时间:2014-11-06 10:46:15

标签: sql-server vb.net sql-server-2005 visual-studio-2008

我是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 = ""

2 个答案:

答案 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不是该表中的唯一索引)。这真的是你想要做的吗?