2012-11-21 143 views
1

這裏是我的代碼:我與INSERT錯誤INTO語句

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語句。「

回答

1

帶空格的表名應該在方括號(產品信息已被封閉空間名稱),列名稱(產品名稱,收到日期)也是如此。
然後,如果您確實在所有列名稱中都有:,則隨處使用方括號,否則從sql文本(以及數據庫字段)中刪除:

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

表示從來沒有使用字符串連接來構建一個sql文本傳遞給數據庫引擎。
你避免與日期和文本分析的問題(例如,如果你輸入文本的一個包含報價,一切都將失敗),而且你avoid Sql Injection Attacks

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) 

我假設數量是數字列,收到日期是DateTime列和價格的數字列。

+0

列名中的冒號是故意的。我在問題中編輯了我的查詢,請檢查是否還有錯誤。謝謝 –

+0

不,還有錯誤:''[條形碼:,價格:]'應該是'[Barcode:],[Price:]',並且從VALUES(.....)中刪除你的文字,然後使用?佔位符 – Steve

+0

我剛剛修復它,但插入語句仍存在錯誤 –

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) 

不知道如何處理的表,如果它確實有一個空間,即產品信息,也許用[產品信息]

最後確保沒有非法字符在從控件獲取值時插入到語句中。

也許考慮使用SP並參數化值或對輸入進行清理。

只是一個想法。

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

什麼與:在每個列名後,隨意解釋在評論。我的猜測是這是錯誤的...

" & txtItemName.Text & "需要封裝在'因爲它是文本。

" & cmbItemType.Text & "需要封裝在'因爲它是文本。

" & txtDate.Text & "需要轉換成日期。

" & txtBarcode.Text & "需要在'包裝',因爲它是文本。

",);"最後一個逗號需要移除。

我不完全確定你可以在表名和/或列名中有空格,隨時留下關於這個人的評論。

我的猜測然而,這是某種類型的學校的任務,因爲有更多的不對的查詢比什麼是正確的...

+0

我編輯了我的問題,請再次檢查錯誤。請原諒我使用的代碼,因爲我只是在這個新的。 –

+0

跟隨史蒂夫告訴你的。他比我更瞭解這種方式。 – WozzeC