您好,需要您的帮助来确定此代码中的错误, 这用于从checkboxlist多选中填充sql db但是 没有给出所需的结果。
我需要保存同一行中列的所有选择但是何时 每次给出相同的结果
时运行它
field_1 field_2 field_3 id
test2 test3 test4 1
即使是选定的值(测试5,测试6,测试7)也没有(测试2,测试3, 测试4)来自cbl。
非常感谢您的帮助:)
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>
答案 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
。然后,您可以支持任意数量的选定选项。