0

これが私のコードです:

Imports System.Data
Imports System.Data.OleDb

Public Class frmAdd
Dim con As New OleDbConnection
Dim com As New OleDbCommand
Dim ins As New OleDbCommand
Dim upd As New OleDbCommand
Dim strcon = ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source = Supplies.mdb")

Private Sub frmAdd_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    con.ConnectionString = strcon
    con.Open()
End Sub

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    ins.CommandText = "INSERT INTO [product info] ([Product Name:],[Description:],[Quantity:],[Type:],[Date Received:],[Barcode:],[Price:]) VALUES ('" & txtItemName.Text & "', '" & txtDescription.Text & "', " & txtItemCount.Text & ", '" & cmbItemType.Text & "', " & txtDate.Text & ", '" & txtBarcode.Text & "', '" & txtPrice.Text & "',);"
    ins.Parameters.AddWithValue("@name", txtItemName.Text)
    ins.Parameters.AddWithValue("@desc", txtDescription.Text)
    ins.Parameters.AddWithValue("@count", Convert.ToInt32(txtItemCount.Text))
    ins.Parameters.AddWithValue("@type", cmbItemType.Text)
    ins.Parameters.AddWithValue("@dt", Convert.ToDateTime(txtDate.Text))
    ins.Parameters.AddWithValue("@code", txtBarcode.Text)
    ins.Parameters.AddWithValue("@price", txtPrice.Text)

    ins.CommandType = CommandType.Text
    ins.Connection = con
    ins.ExecuteNonQuery()
    ins.Dispose()

    con.Close()

すべてのテキストボックスを埋めた後、保存ボタンを押して保存ボタンを押すと、「INSERT INTO ステートメントの構文エラー」というエラーが表示されます。

4

4 に答える 4

1

挿入コード:

  ins.CommandText = "INSERT INTO product info (Product Name:,Description:,Quantity:,Type:,Date Received:,Barcode:,Price:) VALUES (" & txtItemName.Text & ", '" & txtDescription.Text & ", " & txtItemCount.Text & ", " & cmbItemType.Text & ", " & txtDate.Text & ", " & txtBarcode.Text & ", " & txtPrice.Text & ",);"

列の間に「:」があります。意図的かどうかはわかりません。

また、ステートメントへの挿入が間違っています。次のようになります。

INSERT INTO ProductInfo(ProductName, Description, Quantity,.....etc)

製品情報などのスペースがある場合、テーブルの処理方法がわからない場合は、[製品情報] を使用してください。

最後に、コントロールから値を取得するときに、insert into ステートメントに不正な文字が含まれていないことを確認してください。

SPの使用を検討し、値をパラメータ化するか、入力をサニタイズすることを検討してください。

ただのアイデア。

于 2012-11-21T11:29:03.697 に答える
1

Whats with : 各列名の後に、コメントで自由に説明してください。私の推測では、それは間違っていると思います...

" & txtItemName.Text & "テキストなので、' でカプセル化する必要があります。

" & cmbItemType.Text & "テキストなので、' でカプセル化する必要があります。

" & txtDate.Text & "日付に変換する必要があります。

" & txtBarcode.Text & "テキストなので、' でカプセル化する必要があります。

",);"最後のコンマを削除する必要があります。

テーブル名や列名にスペースを含めることができるかどうかは完全にはわかりません。これについて誰かにコメントを残してください.

ただし、このクエリには正しいことよりも間違っていることが多いため、これはある種の学校の課題だと思います...

于 2012-11-21T11:36:00.683 に答える
1
ins.CommandText = "INSERT INTO product info (Product Name:,Description:,Quantity:,Type:,Date Received:,Barcode:,Price:) VALUES (" & txtItemName.Text & ", '" & txtDescription.Text & ", " & txtItemCount.Text & ", " & cmbItemType.Text & ", " & txtDate.Text & ", " & txtBarcode.Text & ", " & txtPrice.Text & ",);"

ステートメントを修正してください。つまり、クエリに余分なアポストロフィ (') が 1 つあります。そのアポストロフィを削除するだけです。うまくいくと思います

于 2012-11-21T11:30:12.537 に答える
1

スペースを含むテーブル名は角括弧で囲む必要があります (製品情報の名前にスペースが含まれます)。列名 (製品名、受領日) についても同様です。
次に、実際にすべての列名に a がある場合は、どこでも角括弧を使用します。そうでない場合は、SQL テキスト (およびデータベース フィールド) からa:を削除します。:

ins.CommandText = "INSERT INTO [product info] ([Product Name:], [Description:], " + 
                 "[Quantity:],[Type:],[Date Received:],[Barcode:],[Price:]) " + 
                 "VALUES (?,?,?,?,?,?,?)"

つまり、文字列連結を使用して SQL テキストを作成し、データベース エンジンに渡すことは絶対にしないでください。
日付とテキストの解析に関する問題を回避し (たとえば、入力テキストの 1 つに引用符が含まれている場合、すべてが失敗します)、さらにSQL インジェクション攻撃を回避します。

ins.Parameters.AddWithValue("@name", txtItemName.Text)
ins.Parameters.AddWithValue("@desc", txtDescription.Text)
ins.Parameters.AddWithValue("@count", Convert.ToInt32(txtItemCount.Text))
ins.Parameters.AddWithValue("@type", cmbItemType.Text)
ins.Parameters.AddWithValue("@dt", Convert.ToDateTime(txtDate.Text)
ins.Parameters.AddWithValue("@code", txtBarcode.Text)
ins.Parameters.AddWithValue("@price", Convert.ToDecimal(txtPrice.Text)

Quantityは数値列、Date Receivedは DateTime 列、Priceは数値列であると想定しています。

于 2012-11-21T11:49:58.253 に答える