0

これは、コードで挿入クエリを使用できないことです。値と一致しないというエラーがあります。何とかSqlCommand何とかExecuteNonQuery()

これが私のコードです

Dim con As New SqlClient.SqlConnection("Server=.\SQLExpress;AttachDBFilename=C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\Finals.mdf;Database=Finals;Trusted_Connection=Yes;")

Dim cmd As New SqlClient.SqlCommand
cmd.Connection = con
cmd.CommandText = "Insert Into [Finals].[dbo].[Nokia]  Values ('" & Unit.Text & "'),('" & Price.Text & " '),('" & Stack.Text & "'),('" & Processor.Text & "'),('" & Size.Text & "'),('" & RAM.Text & "'),('" & Internal.Text & "'),('" & ComboBox1.Text & "')"

con.Open()
cmd.ExecuteNonQuery()
con.Close()

問題は、cmd.CommandText誰かが私を助けてくれますか?

4

1 に答える 1

4

パラメータ化されたクエリを使用するには、クエリを書き直す必要があります。これにより、テキストボックスに一重引用符が含まれている場合の解析の問題が回避され、最も重要なこととして、Sql インジェクションの可能性が排除されます。

したがって、コードは次のようになります

Dim cmdText = "Insert Into [Finals].[dbo].[Nokia]  Values (@unit, @price,@stack," & _ 
              "@processor,@size,@ram,@internal,@lastvalue"
Using con As New SqlConnection(......)
Using cmd As New SqlCommand(cmdText, con)
   con.Open()
   cmd.Parameters.AddWithValue("@unit",Unit.Text )
   cmd.Parameters.AddWithValue("@price",Price.Text)
   cmd.Parameters.AddWithValue("@stack",Stack.Text)
   cmd.Parameters.AddWithValue("@processor", Processor.Text)
   cmd.Parameters.AddWithValue("@size",Size.Text)
   cmd.Parameters.AddWithValue("@ram", RAM.Text)
   cmd.Parameters.AddWithValue("@internal",Internal.Text)
   cmd.Parameters.AddWithValue("@lastvalue", ComboBox1.Text)
   cmd.ExecuteNonQuery()
End Using
End Using

そうは言っても、さらに2つの問題に注意してください。

VALUES ステートメントの前に列リストを指定しません。これは、Nokia という名前のテーブルに存在するすべての列の正確な数のパラメーターを渡す必要があり、基礎となる列の正確な順序で渡す必要があることを意味します。パラメータを 1 つ忘れると例外が発生し、パラメータの順序を入れ替えると、間違った列にデータを書き込むことになります (データ型が一致しない場合は例外が発生します)。

2 番目の問題は、クエリに渡されるすべてのパラメーターのデータ型に関するものです。あなたの場合、テキストボックスのTextプロパティを使用します。これは、データテーブルのすべての列に文字列を渡すことを意味します。もちろん、列に数値が必要な場合は、不一致エラーが発生します。

たとえば、パラメーターを使用してデータテーブルの 10 進数の列を更新することができるため、メソッド@priceを使用してパラメーターを追加する前に、パラメーターを文字列から 10 進数に変換する必要があります。AddWithValue

 cmd.Parameters.AddWithValue("@price",Convert.ToDecimal(Price.Text))
于 2013-10-18T14:33:21.913 に答える