SQL грешка Access 2010 VBA Update Command

Имам нужда от помощ, за да разбера грешка в моя SQL оператор. Опитах няколко неща, но изглежда нищо не работи? Това е съобщението за грешка, което получавам

Run-time error '3075':

Syntax error (missing operator) in query expression '([description] = Manufacturing and Delivery Schedule AND [pr_num] = 83)'.

Това е моят код:

Private Sub Command6_Click()
' ===================================================
' Receives the selected item in the combo box
' ===================================================

' Open the Database connection
Dim data_base As Database
Set data_base = CurrentDb

' Grab description and pr number from the form
Dim desc As string
dim pr_number as long
desc = Combo4.Value
pr_number = Text8.Value

' Build the query
Dim query As String
query = "UPDATE VDR_Table " & _
    "SET [received] = [p1] " & _
    "WHERE ([description] = " & desc & _
    " AND [pr_num] = " & pr_number & ");"

Dim rec_set As DAO.Recordset
Set rec_set = data_base.OpenRecordset(query)

' Build the QueryDef
Set qd = data_base.CreateQueryDef("")
qd.SQL = query

' Execute query
qd.Parameters("p1").Value = true
qd.Execute

' Close nad null record set
rec_set.close
set rec_set = nothing

' Close the connection to the database
data_base.Close

' Prompt the user success
MsgBox "Item has been received"
End Sub

Благодаря предварително за всяка помощ!


person nathansizemore    schedule 27.08.2012    source източник


Отговори (1)


Трябва да оградите стойността на полето за описание, което задавате в кавички, тъй като това е низово поле. Трябва да изглежда така:

' Build the query
Dim query As String
query = "UPDATE VDR_Table " & _
    "SET [received] = [p1] " & _
    "WHERE ([description] = '" & desc & _
    "' AND [pr_num] = " & pr_number & ");"

Премахнах връзките по-долу, тъй като те нямат значение в този случай.

Също така бих препоръчал да използвате параметри вместо конкатенации на низове, за да избегнете SQL инжекции. Ето пример за използване на параметри с VBA - http://support.microsoft.com/kb/181734 - и ето някои разсъждения защо да използвате параметризиран sql - http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html.

person ryanulit    schedule 27.08.2012
comment
Ще имате затруднения с DAO, параметри и дълъг низ. SQL Injection не е съвсем същото в MS Access. Бих бил склонен да избегна всякакви възможни единични кавички в desc. - person Fionnuala; 27.08.2012
comment
Избягването на кавичките със сигурност, но ако той използва параметри, няма ли да се погрижи за този проблем? - person ryanulit; 27.08.2012
comment
Не можете да използвате параметър с DAO и низ, по-дълъг от 255. - person Fionnuala; 27.08.2012
comment
Поставянето му в кавички се погрижи за съобщението ми за грешка, но получавам друга грешка. Дава ми грешка в реда qd.Execute. Казва, че очаква 2 параметъра? Някакви идеи по въпроса? - person nathansizemore; 27.08.2012
comment
Не съм много притеснен от инжекционните атаки. Това е само вътрешно офис приложение и съмнително някой би искал да опита да получи информацията, която е тук. - person nathansizemore; 27.08.2012
comment
Примерът за параметър, който показвате, използва ADO, най-бавната опция за MS Access. Докато SQL инжектирането е истинско безпокойство, то просто не е същото за повечето приложения на MS Access, докато преминаването от DAO към много по-малко жизнеспособния ADO би било истински проблем. - person Fionnuala; 27.08.2012
comment
Да, не съм толкова запознат с най-добрите методи за VBA и MS Access, така че каквото и да искате да направите, зависи от вас. Що се отнася до грешката на параметъра, може би командата за изпълнение изисква 2 параметъра в своето извикване? Както казах, не съм толкова запознат с VBA, така че това е просто предположение. - person ryanulit; 27.08.2012