2011-11-09 55 views
0

我正在製作一個表格來將一些記錄添加到我的數據庫中&我遇到了一些問題。如果用戶填寫名爲「產品」的字段,我想通過使該產品在數據庫中可見的一張圖片通知他。 (我只是想告訴他 - 不禁止添加的選項)VBA中的strSQL的結果(Access 2003)

我有這個代碼,不幸的是它給我一個錯誤(運行時錯誤沒有操作員)

Private Sub ProductText_LostFocus() 
Dim cnn as New ADODB.Connection 
Dim strSQL as String 
Dim rs as New ADODB.Recordset 
Set cnn = CurrentProject.Connection 
strSQL = "Select Product FROM Shopping WHERE Product = " & ProductText.Value 
Set rs = cnn.Execute(strSQL) 
If rs.RecordCount > 0 then 
ShowPicture.Visible = True 
End if 
End sub 

我做什麼錯誤?

+0

如果「項目Service items」不是數字,則該值需要用單引號括起來。 '... WHERE Product ='「&ProductText.Value&」'「' –

+0

好的,謝謝它不會傳達任何錯誤,但我沒有看到效果 - 圖片仍然不可見(無論產品是否在數據庫中),例如TextField的顏色不會改變太紅,怎麼回事? – ChrisParker

+0

測試rs.EOF不是Recordcount。如果沒有匹配,那麼rs.EOF將爲True。 –

回答

0

你有幾個不同的問題。

首先,不要創建和CNN的新實例RS,因爲他們要麼設置或更高版本創建:

Dim cnn as ADODB.Connection 
Dim strSQL as String 
Dim rs as ADODB.Recordset 

其次,你需要附上的產品報價中的SQL(你可能需要做額外的工作,如果producttext包含單引號):如果你使用強類型Parameter對象Command對象

strSQL = "Select Product FROM Shopping WHERE Product = '" & ProductText.Value & "'" 
+2

'OpenRecordset'是一個DAO方法,對於ADO,但是我不願意編輯你的答案來解決這個問題,因爲我認爲你的處理引號的建議是不正確的,也就是說他們應該在'Parameter'對象中使用'Command'對象,允許OLE DB提供者轉義引號等。不要假設Access(ACE,Jet,不管)是否對[SQL注入](http://stackoverflow.c OM /問題/ 512174 /非web-SQL注入/)。 – onedaywhen

+0

對不起,當我看到記錄集時,我有一個閃回到vb6的日子。我已經糾正了答案。我完全同意命令對象建議和SQL注入,但我只是試圖回答具體問題,而沒有更正代碼中的所有問題(它們也應該有異常處理,應該在完成時關閉記錄集,並且應該真的更改查詢以使其返回單個值(例如count(1)),以便他們可以使用adExecuteRecord選項返回Record而不是Recordset)。 –

+0

關於使用'COUNT()'和錯誤處理的好處,但我似乎無法使用'adExecuteRecord'選項來返回一個記錄:與Command對象我得到錯誤,「對象或提供程序無法執行請求的操作「並且用我得到的Connection對象,」參數是錯誤的類型,超出了可接受的範圍,或者彼此衝突。「 – onedaywhen

1

,你將不必擔心包括或在您的參數值逃避報價,再加上你與免疫從SQL injection

在這裏,我有點簡化您的代碼,並假設你ProductNVARCHAR(255)即寬度可變的Unicode(不壓縮)文本:

Private Sub ProductText_LostFocus() 
    Dim cmd As New ADODB.Command 
    With cmd 
    Set .ActiveConnection = CurrentProject.Connection 
    .CommandText = "Select Product FROM Shopping WHERE Product = ?;" 
    .CommandType = adCmdText 
    .Parameters.Append .CreateParameter(, adVarWChar, , 255, ProductText.Value) 
    If Not .Execute().EOF Then 
     ShowPicture.Visible = True 
    End If 
    End With 
End Sub