如何循环检查CheckBoxList并为每个选中的值向数据库提交值?

时间:2011-06-10 15:33:44

标签: asp.net sql vb.net

我正在尝试使用存储过程将checkboxlist值插入SQL Server。我收到此错误

  

项目为了评估索引属性,必须对该属性进行限定,并且必须由用户显式提供参数。

这是我的存储过程:

ALTER PROCEDURE [dbo].[usp_insertquestionnarie] 
    (@interestid int)

    INSERT INTO [a_abacus].[dbo].[joininterest]
    VALUES (@interestid)

这是我的vb代码:

 Protected Sub cmdsubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdsubmit.Click

        Dim strConnString As String = WebConfigurationManager.ConnectionStrings("a_abacus").ConnectionString
        Dim con As New SqlConnection(strConnString)
        Dim cmd As New SqlCommand("usp_insertquestionnarie", con) 'references connectionstring and calls store procedure'
        cmd.CommandType = Data.CommandType.StoredProcedure 'sets default to be stored procedure'
        lblmessage.Text = String.Empty

        Dim Item As ListItem
        lblMessage.Text = ""
        For Each Item In chkboxinterest.Items
            If Item.Selected = True Then
                con.Open()
                cmd.Parameters.AddWithValue("@interestid", Item.Value)
                cmd.ExecuteNonQuery() 'for updating database'
                lblmessage.Text = "Successfull"
                cmd.Parameters.Clear()
            Else
                lblmessage.Text = "Error"
            End If
            con.Close()
        Next
    End Sub

这是aspx页面标记:

 <asp:CheckBoxList ID="chkboxinterest" runat="server" RepeatColumns="3" 
            Width="650px">
       <asp:ListItem class="chkbox" runat="server" Text="Aerobics" Value="1" />
       <asp:ListItem class="chkbox" runat="server" Text="Antiques & Collectibles" Value="2" />
       <asp:ListItem class="chkbox" runat="server" Text="Arts & Crafts" Value="3" />
       <asp:ListItem class="chkbox" runat="server" Text="Astronomy" Value="4" />
       <asp:ListItem class="chkbox" runat="server" Text="Auto Racing" Value="5" />
    </asp:CheckBoxList>

1 个答案:

答案 0 :(得分:2)

首先,不需要经常为SQL命令添加参数。

cmd.Parameters.AddWithValue("@interestid", Item.Value) 

你需要改变它。

在循环之前,将参数(无值)添加到SqlCommand。但是,将其声明为SQLDbType.int类型。

cmd.Parameters.Add("@interestid", SQLDBType.Int)

然后,在循环中,您只需要更改SQL命令的值。

cmd.Parameters("@interestid").Value = Item.Value

删除cmd.Parameters.Clear()

其次,从循环中删除con.Open()和con.Close()。

您只需要在循环之前打开连接,并在循环之后关闭它。

第三,在Item.Value上执行一些输入验证

它真的在您认为的范围内吗?在标记中使用RangeValidator,或在代码隐藏中执行一些自定义逻辑。至少,请执行以下操作:CInt(Item.Value)

第四,您的Alter Procedure声明缺少必需的AS关键字

http://msdn.microsoft.com/en-us/library/ms189762.aspx

Alter MyProc (@param int) **AS** Select * from Products