在SQL代码中插入CheckBoxList

时间:2014-02-17 01:17:11

标签: vb.net checkboxlist

  

您好,需要您的帮助来确定此代码中的错误,   这用于从checkboxlist多选中填充sql db但是   没有给出所需的结果。

     

我需要保存同一行中列的所有选择但是何时   每次给出相同的结果

时运行它
field_1  field_2  field_3  id

test2     test3   test4    1
  

即使是选定的值(测试5,测试6,测试7)也没有(测试2,测试3,   测试4)来自cbl。

     

非常感谢您的帮助:)

Test.aspx.vb

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

' Define data objects
        Dim myConn As SqlConnection
        Dim cmd As SqlCommand
        Dim sqlstring As String

        ' Read the connection string 
        myConn = New SqlConnection("Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\EmailEngineDB.mdf;Integrated Security=True")

        ' Create command
        sqlstring = " INSERT INTO TestTBL (field_1, field_2, field_3) VALUES (@field_1, @field_2, @field_3)"
        cmd = New SqlCommand(sqlstring, myConn)

        ' Add command parameters
        For i As Integer = 0 To CheckBoxList1.Items.Count - 1
            If CheckBoxList1.Items(i).Selected Then


                cmd.Parameters.Add("@field_" + i.ToString(), Data.SqlDbType.NVarChar)
                cmd.Parameters("@field_" + i.ToString()).Value = CheckBoxList1.Items(i).Text
            End If

        Next
        ' Enclose database code in Try-Catch-Finally
        Try
            ' Open the connection
            myConn.Open()
            ' Execute the command
            cmd.ExecuteNonQuery()
            ' Display success message
            Label1.Text = "Created Successfully :)"
            ' Reload page if the query executed successfully
            ' Response.Redirect("SamplesCollector.aspx")

        Catch ex As Exception
            ' Display error message
            Label1.Text = "Error ! Please try again "
        Finally
            ' Close the connection
            myConn.Close()
            'Response.Redirect("SamplesCollector.aspx")
        End Try
    End Sub

Test.aspx文件


    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Test.aspx.vb" Inherits="Test" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:CheckBoxList ID="CheckBoxList1" runat="server" AutoPostBack="True">
            <asp:ListItem>test 1</asp:ListItem>
            <asp:ListItem>test2</asp:ListItem>
            <asp:ListItem>test 3</asp:ListItem>
            <asp:ListItem>test 4</asp:ListItem>
            <asp:ListItem>test 5</asp:ListItem>
            <asp:ListItem>test 6</asp:ListItem>
            <asp:ListItem>test 7</asp:ListItem>
            <asp:ListItem>test 8</asp:ListItem>

        </asp:CheckBoxList>
        <br />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

您的数据库表只能容纳三个字段值。

查询:

INSERT INTO TestTBL (field_1, field_2, field_3) VALUES (@field_1, @field_2, @field_3)

仅包含三个参数(@field_1@field_2@field_3)。

所以,在你的循环中:

For i As Integer = 0 To CheckBoxList1.Items.Count - 1
        If CheckBoxList1.Items(i).Selected Then


            cmd.Parameters.Add("@field_" + i.ToString(), Data.SqlDbType.NVarChar)
            cmd.Parameters("@field_" + i.ToString()).Value = CheckBoxList1.Items(i).Text
        End If

    Next

尽管这会(根据您的清单定义)迭代8个项目,但只有“ test2 ”,“测试3 ”和“测试4 “会在选中它们时传递给数据库。

这是因为他们在核对清单中的位置与参数的名称相匹配(即“ test2 ”是项目编号1(从零开始的列表)并且将匹配到@field_1)。

为了存储所有选定的选项,您确实应该更改数据库表结构以允许任意数量的项。在最坏的情况下,您需要在表格中添加其他列以考虑剩余的可用核对表项目(最多field_8),并且您还需要考虑列表中的第一项具有索引为0而不是1.

例如,在Question和SelectedOptions表之间创建一对多关系。

<强>问题:

QuestionId | UserId
1          | 1

<强> SelectedOptions:

SelectedOptionId | QuestionId | SelectedValue
1                | 1          | test2
2                | 1          | test 3

然后,对于检查的每个值,您的插入循环会将记录插入SelectedOptions。然后,您可以支持任意数量的选定选项。