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パラメータと同じ

パラメータ名が同じではないことがわかります。この 2 つの問題を修正すると、他の部分は問題ないように見えます。

于 2012-10-08T10:09:02.400 に答える