【问题标题】:Insert >1 selected checkbox values from CheckedListBox into SQL Server将 CheckedListBox 中的 >1 个选定复选框值插入 SQL Server
【发布时间】:2014-11-06 10:46:15
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您必须纠正的第一件事是Insert 命令允许使用它们的 is no where 条件。

    如果您想在单个查询中插入多行意味着您可以使用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()
    

    【讨论】:

    • 半正确。关于 MULTIPLE SELECTED CHECKBOXES 部分的一部分
    • CheckedListBox.CheckedIndices,现在情况更糟了,因为 Items 不是复选框的集合。
    • 你好 Neethu Soman 你的代码对我有帮助,但它在 (cmd.ExecuteNonQuery) 上的“System.Data.DataRowView”附近显示错误语法
    • 我的代码 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim sql As String = "Insert into Modules (Module_Name) VALUES" For Each itemChecked CheckedListBox1.CheckedItems sql &= "('" & itemChecked.ToString & "')" Next cmd.CommandText = sql.Substring(0, Len(sql) - 1) '
    【解决方案2】:

    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 和名称。然后你写代码在同一个表中再次插入模块名称?您最终会在该表中得到重复的模块名称(如果 Module_Name 不是该表中的唯一索引)。这真的是你想要做的吗?

    【讨论】:

    • 如果我正在使用此代码,那么首先告诉我我如何一次使用两个类
    • 一次两个类是什么意思?您的原始问题中不存在此条件
    • 我的代码是这个,请在​​此处检查它在 Dim Builder 上显示错误作为 Builder 类型上的新 System.Text.StringBuilder,错误是:错误 1 ​​重载解决失败,因为无法访问“新”在没有缩小转换的情况下调用:'Public Sub New(value As String)':参数匹配参数'value'从'Object'缩小到'String'。 'Public Sub New(capacity As Integer)':参数匹配参数 'capacity' 从 'Object' 缩小到 'Integer'。我的代码是:在下一条评论中
    • Private Sub StringBuilder() Dim Builder As New System.Text.StringBuilder("Insert into Modules (Module_Name) VALUES('" & CheckedListBox1.SelectedItem & "')") For Each c in CheckedListBox1. CheckedItems Dim value = CheckedListBox1.Items(c) Builder.Append("Module_Name ('" & CheckedListBox1.SelectedValue & "'") Next Builder.Length -= 1 ' 去掉最后一个逗号' cmd.CommandText = Builder.ToString() cmd.Connection = cn
    • 当然,您已经更改了发布的代码,现在它没有任何意义。 SelectedItem 是对象类型的属性,传递给 StringBuilder 构造函数时需要一个 ToString。但是为什么你以这种方式更改代码?现在您不再需要传递多个插入所需的逗号,并且生成的 sql 无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2015-07-27
    • 2016-06-09
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多