使用变量创建SQL参数

时间:2012-10-08 09:48:33

标签: sql vb.net

我有一个循环,它从文本框和下拉列表中获取值,并使用它们来更新SQL表。我需要能够重命名参数,并根据循环计数的变量为它们赋值。示例:如果循环从0变为2,则textname_0将转至@ paramname_0,textname_1将转至@ paramname_1,依此类推。

我已经编写了下面的代码但它生成了一个错误,无法找到第一个参数,因此语法显然是错误的。

    Protected Sub Insert_To_Tables()

    Try


        Dim con As SqlConnection = New SqlConnection()
        Dim connectionString As String = "Data Source=wolf;Initial Catalog=Seat_Planner_2013;Integrated Security=True;Integrated Security=True"
        Using cn As New SqlConnection(connectionString)

            For i As Int32 = 0 To number_of_tickets_Ddl.SelectedValue

                cn.Open()
                Dim cmd As New SqlCommand()
                cmd.CommandText = "INSERT INTO tables ([table_num], [seat], [available], [ticket_num], [seat_title], [seat_firstname], [seat_surname], [booking_ref],[booked_by]) VALUES (@table_num_ & i, @seat_ & i, @available_ & i, @ticket_num_ & i, @seat_title_ & i, @seat_firstname_ & i, @seat_surname_ & i, @booking_ref, @booked_by) WHERE ([table_num] = @table_num) AND ([seat] = @seat_ & i)"

                cmd.Parameters.Add("@table_num", SqlDbType.SmallInt).Value = ddltable.SelectedValue
                cmd.Parameters.Add("@seat_" & i, SqlDbType.NChar).Value = CType(Me.FindControl(("DDLSeat_") & i), DropDownList).SelectedValue
                cmd.Parameters.Add("@available", SqlDbType.NChar).Value = "No"
                cmd.Parameters.Add("@ticket_num_" & i, SqlDbType.NChar).Value = CType(Me.FindControl(("TicketNo_TextBox_") & i), TextBox).Text.Trim
                cmd.Parameters.Add("@seat_title_" & i, SqlDbType.NChar).Value = CType(Me.FindControl(("Title_TextBox_") & i), TextBox).Text.Trim
                cmd.Parameters.Add("@seat_firstname_" & i, SqlDbType.NChar).Value = CType(Me.FindControl(("FirstName_TextBox_") & i), TextBox).Text.Trim
                cmd.Parameters.Add("@seat_surname_" & i, SqlDbType.NChar).Value = CType(Me.FindControl(("Surname_TextBox_") & i), TextBox).Text.Trim
                cmd.Parameters.Add("@booking_ref", SqlDbType.NChar).Value = booking_ref_LBL.Text
                cmd.Parameters.Add("@booked_by", SqlDbType.NChar).Value = CType(Me.FindControl(("TBoxFull_name_0")), TextBox).Text.Trim

                cmd.Connection = cn
                cmd.ExecuteNonQuery()
                cn.Close()

            Next

        End Using

        DB_error1.Text = " Insert to tables success. "

    Catch ex As Exception

        DB_error1.Text = "Fail "
        DB_error1.Text = DB_error1.Text + ex.Message.ToString
    Finally

    End Try

2 个答案:

答案 0 :(得分:1)

SQL没有动态参数名称 - 它们是固定的。例如 - 您在SQL查询(@table_num)中有一个CommandText参数。此外,您在字符串中有& i ,这使无效的SQL

只需使用(@table_num, @seat, @available, ...

即可

添加的参数必须匹配这些名称,因此连接是SQL中或添加参数时要执行的错误的事情。

只需删除连接,事情应该按预期工作。


为了提高效率,建议您阅读table valued parameters

答案 1 :(得分:0)

  1. 检查您的cmd.CommandText,您应该将变量i取出引号。

  2. 您还可以将参数名称设置为@table_num,但是您想要像@table_num_1

    一样使用它

    cmd.Parameters.Add(“@ table_num”,SqlDbType.SmallInt).Value = ddltable.SelectedValue

    cmd.CommandText = ... VALUES( @table_num_& i ,...

    @available参数

  3. 相同

    您看到参数名称不会相同,因此当您解决这两个问题时,其他部分似乎没问题。