web-dev-qa-db-ja.com

VBのSQLコマンドでパラメーター "@"を使用する方法

VBで、テキストボックスのデータからSQLデータベースを更新するためのこのコードがあります。テキストに目盛り、 '、または引用符などが含まれている場合は、パラメーターを使用する必要があります。

dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP")
    dbConn.Open()

    MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = '" & TicBoxText.Text & _
                                            "'WHERE Number = 1", dbConn)

    MyDataReader = MyCommand.ExecuteReader()
    MyDataReader.Close()
    dbConn.Close()

そして、これは私がウェブ上で見たものからパラメーターを設定しようとする私の足りない試みですが、それはあまりよく理解していません。

dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP")
    dbConn.Open()

    MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @'" & TicBoxText.Text & _
                                            "'WHERE Number = 1", dbConn)

    MyDataReader = MyCommand.ExecuteReader()
    MyDataReader.Close()
    dbConn.Close()

これどうやってやるの?コードを実行したときにテキストボックスに 'マークがあると、クラッシュします。

7
TitanicSwimmer

あなたは Bobby Tables を避けるための正しい道を進んでいますが、@パラメータが不完全です。

名前付きパラメーターは、プログラミング言語ではvariablesのように動作します。最初にSQLコマンドで使用し、次にVB.NETまたは次のようなC#プログラム:

MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @TicBoxText WHERE Number = 1", dbConn)
MyCommand.Parameters.AddWithValue("@TicBoxText", TicBoxText.Text)

コマンドのテキストがどのように自己完結したかに注意してください。テキストボックスのテキストの値に依存しないため、ユーザーは独自のコマンドを挿入してSQLを壊すことができません。 @TicBoxTextは、コマンドのテキスト内の値を表す変数の名前になりました。 AddWithValueの呼び出しで値が提供されます。その後、ExecuteReaderを使用する準備が整います。

22
dasblinkenlight

ここには多くの改善点があります:

Using dbConn As New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP"), _
      MyCommand As SqlCommand("UPDATE SeansMessage SET Message = @Message WHERE Number = 1", dbConn)

    'Make sure to use your exact DbType (ie: VarChar vs NVarChar) and size
    MyCommand.Parameters.Add("@Message", SqlDbType.VarChar).Value = TicBoxText.Text

    dbConn.Open()
    MyCommand.ExecuteNonQuery() ' don't open a data reader: just use ExecuteNonQuery
End Using 'Using block will close the connection for you
10
Joel Coehoorn