0

私の目的は、チェックボックスリストからチェックされたすべての項目をデータベースの単一の列に入力することです。良いデザインではないことは理解しています。ただし、これは要件です。

チェックボックスリストから選択したすべてのアイテムを取得するために使用するコードは次のとおりです。

 Dim listitems As String
 listitems = ControlChars.CrLf
            For i = 0 To (chkActivities.Items.Count - 1)
                If chkActivities.GetItemChecked(i) = True Then
                    listitems = listitems & (i + 1).ToString & chkActivities.Items(i).ToString & ControlChars.CrLf
                End If
            Next

テーブルにデータを入力するために実行された接続文字列とコマンドは次のとおりです。

>

            objCon.Open()
            objCmd = New SqlCommand("insert into activity_by_customer (userID, city, personal_activities, BookingDate, price) values ( '" & frmLogin.userID & "','" & cbbCity.Text & "','" & listitems & "','" & Date.Today & "','" & lblpriceValue.Text & "' )", objCon)
            objCmd.ExecuteNonQuery()
            activitiesbycustomer.Update(Me.ResourcesDataSet.activity_by_customer)
            MsgBox("Your booking has been successful")
            objCon.Close()

ただし、このコードを実行すると、エラーでクラッシュします。エラーは次のとおりです。

「s」付近の構文が正しくありません。文字列 ' )' の後の引用符が閉じていません。

このエラーは、'listitems' が原因で発生します。どんな助けでも大歓迎です。

4

1 に答える 1

0

リスト項目を作成する方法は問題ではありませんが、値をデータベースに渡す方法は問題です。

文字列連結を使用して SQL コマンドを作成しないでください

objCon.Open()
objCmd = New SqlCommand("insert into activity_by_customer " & _ 
    "(userID, city, personal_activities, BookingDate, price) " & _ 
    "values (@usrID, @city, @itms, @dt, @price)", objCon)
objCmd.Parameters.AddWithValue("@usrID",frmLogin.userID)
objCmd.Parameters.AddWithValue("@city",cbbCity.Text)
objCmd.Parameters.AddWithValue("@itms", listitems)
objCmd.Parameters.AddWithValue("@dt",Date.Today)
objCmd.Parameters.AddWithValue("@price", lblpriceValue.Text)
objCmd.ExecuteNonQuery()
....

このように、フレームワーク コードは、一重引用符などの文字の存在を考慮して値をフォーマットし、結果として生じる構文エラーを回避します。さらに、このようにしてSQLインジェクション攻撃を回避します

于 2013-05-06T21:50:48.457 に答える