我有一个循环,它从文本框和下拉列表中获取值,并使用它们来更新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
答案 0 :(得分:1)
SQL没有动态参数名称 - 它们是固定的。例如 - 您在SQL查询(@table_num
)中有一个CommandText
参数。此外,您在字符串中有& i
,这使无效的SQL 。
只需使用(@table_num, @seat, @available, ...
添加的参数必须匹配这些名称,因此连接是SQL中或添加参数时要执行的错误的事情。
只需删除连接,事情应该按预期工作。
为了提高效率,建议您阅读table valued parameters。
答案 1 :(得分:0)
检查您的cmd.CommandText
,您应该将变量i
取出引号。
您还可以将参数名称设置为@table_num
,但是您想要像@table_num_1
cmd.Parameters.Add(“@ table_num”,SqlDbType.SmallInt).Value = ddltable.SelectedValue
cmd.CommandText = ... VALUES( @table_num_& i ,...
与@available
参数
您看到参数名称不会相同,因此当您解决这两个问题时,其他部分似乎没问题。