-2

以下のコードを使用して、「トランザクション テーブル」に新しいレコードを作成しています。insert ステートメントの 2 行目でエラーがスローされています。パラメーターが少なすぎます。再確認しましたが、すべてのフィールド名が正しいです。この種のエラーの原因として、他に何が考えられるでしょうか?

' Modify this line to include the path to Northwind
' on your computer.
Set dbs = CurrentDb

Dim vblCustomerID As String
Dim vblMealType As String
Dim Charge As Currency
Dim vblDate As String
vblDate = Format(Date, "yyyy-mm-dd")
txtCustomerID.SetFocus
vblCustomerID = txtCustomerID.Text

txtMealType.SetFocus
vblMealType = txtMealType.Text

txtCharge.SetFocus
vblCharge = txtCharge.Text

dbs.Execute "INSERT INTO dbo_Transactions" _
    & "(CustomerID, MealID, TransactionAmount, TransactionDate) VALUES " _
    & "(" & vblCustomerID & ", " & vblMealType & ", " & vblCharge & ", " & vblDate & ");"
dbs.Close
4

2 に答える 2

1

他の人が示唆しているように、パラメータ化されたクエリを使用することは、あなたがやろうとしていることを行うためのはるかに良い方法です. 次のようなことを試してください:

Dim qdf As DAO.QueryDef
Set qdf = dbs.CreateQueryDef("", _
        "PARAMETERS prmCustomerID Long, prmMealID Long, prmTransactionAmount Currency, prmTransactionDate DateTime;" & _
        "INSERT INTO dbo_Transactions (CustomerID, MealID, TransactionAmount, TransactionDate) " & _
        "VALUES ([prmCustomerID], [prmMealID], [prmTransactionAmount], [prmTransactionDate]) ")
qdf!prmCustomerID = txtCustomerID.Value
qdf!prmMealID = txtMealType.Value
qdf!prmTransactionAmount = txtCharge.Value
qdf!prmTransactionDate = Date()
qdf.Execute dbFailOnError
Set qdf = nothing
于 2013-11-13T18:22:59.780 に答える
0

vbl フィールドに読み込んでいるテキスト フィールドに、これらのような特殊文字が含まれていますか?

, ' " 

完全に優れた SQL 挿入コマンドのテキスト フィールド内のこれらすべては、事態を台無しにする可能性があります。ここで起こっていることは間違いありません。

SQLインジェクションにさらされているため、テキストボックス内のテキストをSQLクエリに直接ロードするのではなく、実際にここでパラメーターを使用する方がよいでしょう. 誰かが入力するとどうなりますか

"; Drop Table dbo_Transactions;

あなたのテキストボックスの1つで、このクエリを実行しますか? 誰かがテーブルの 1 つを削除したため、データベースは完全に台無しになります。

パラメータを使用してこの問題を防ぐための情報へのリンクがいくつかあります。これにより、パラメータが少なすぎる問題も修正されるはずです。

http://forums.asp.net/t/886691.aspx

http://sqlmag.com/blog/t-sql-parameters-and-variables-basics-and-best-practices

于 2013-11-13T18:09:34.703 に答える