0

我有一个循环,它从文本框和下拉列表中获取值并使用它们来更新 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
4

2 回答 2

1

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

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

添加的参数必须与这些名称匹配,因此在 SQL 中或添加参数时进行连接是错误的。

只需删除连接,事情就会如您所愿。


为了提高效率,我建议您阅读表值参数

于 2012-10-08T09:57:33.507 回答
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参数相同

您会看到参数名称不一样,因此当您修复这两个问题时,其他部分似乎还可以。

于 2012-10-08T10:09:02.400 回答