Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 运行时错误';3144';:Update语句中的语法错误_Sql_Ms Access_Vba - Fatal编程技术网

Sql 运行时错误';3144';:Update语句中的语法错误

Sql 运行时错误';3144';:Update语句中的语法错误,sql,ms-access,vba,Sql,Ms Access,Vba,我的update语句遇到了一些问题,Add语句似乎可以工作,但我在update中不断遇到语法错误。我是SQL和VBA新手,所以很多这类代码可能看起来像sphagetti代码。如果有人能认出我做错了什么,我将不胜感激。如果有更好的方法,请告诉我 Private Sub btnSubmit\u Click() 将名称设置为字符串 将办公室设置为字符串 按字符串排列 Dim mbrOpType作为字符串 作为字符串的Dim mbrRLA Dim mbrMQT作为字符串 将MBR位置设置为字符串 Dim

我的update语句遇到了一些问题,Add语句似乎可以工作,但我在update中不断遇到语法错误。我是SQL和VBA新手,所以很多这类代码可能看起来像sphagetti代码。如果有人能认出我做错了什么,我将不胜感激。如果有更好的方法,请告诉我

Private Sub btnSubmit\u Click()
将名称设置为字符串
将办公室设置为字符串
按字符串排列
Dim mbrOpType作为字符串
作为字符串的Dim mbrRLA
Dim mbrMQT作为字符串
将MBR位置设置为字符串
Dim sqlAdd As字符串
Dim sqlUpdate作为字符串
如果Me.opgmnglotster.Value=1,则
'-如果为空,则将中间名设置为NMI
如果IsNull(Me.txtMidInit.Value),则
Me.txtmidini.Value=“NMI”
如果结束
'-创建所有大写的成员名称字符串
mbrName=UCase(Me.txtLastName.Value&“,”&Me.txtLastName.Value&“&Me.txtmidini)
"议员办事处
mbrOffice=Me.cbxOffice.Value
"议员职级
mbrank=Me.cbxRank.Value
“-成员的运算符类型
mbrOpType=Me.cbxOpType
“-成员的RLA
mbrRLA=Me.cbxRLA.Value
'-成员的MQT程序
mbrMQT=Me.cbxMQT.Value
'-成员的MQT位置
mbrPos=Me.cbxTngPos.Value
'将成员添加到名册中
sqlAdd=“插入[名册](成员、办公室、职级、操作类型、RLA、[MQT-PROGRAM]、[MQT-POSITION])值(“&mbrName&”、“&MBROOFFICE&”、“&mbrRank&”、“&mbrOpType&”、“&mbrRLA&”、“&mbrMQT&”、“&mbrPos&”);”
DoCmd.RunSQL(sqlAdd)
“-确认消息
MsgBox(“添加:”&mbrName)
其他的
'-如果为空,则将中间名设置为NMI
如果IsNull(Me.txtMidInit.Value),则
Me.txtmidini.Value=“NMI”
如果结束
'-创建所有大写的成员名称字符串
mbrName=UCase(Me.txtLastName.Value&“,”&Me.txtLastName.Value&“&Me.txtmidini)
"议员办事处
mbrOffice=Me.cbxOffice.Value
"议员职级
mbrank=Me.cbxRank.Value
“-成员的运算符类型
mbrOpType=Me.cbxOpType
“-成员的RLA
mbrRLA=Me.cbxRLA.Value
'-成员的MQT程序
mbrMQT=Me.cbxMQT.Value
'-成员的MQT位置
mbrPos=Me.cbxTngPos.Value
'更新成员数据
sqlUpdate=“更新[花名册](成员、办公室、职级、操作类型、RLA、[MQT-PROGRAM]、[MQT-POSITION])值(“&mbrName&”、“&MBROOFFICE&”、“&mbrOpType&”、“&mbrRLA&”、“&mbrMQT&”、“&mbrPos&”)
调试。打印sqlUpdate
DoCmd.runsqlupdate
MsgBox(“更新:&mbrName”)
如果结束
端接头

设置中的一些常规编码和特定MS访问问题:

  • 首先,无需为
    If
    Else
    块重复VBA变量赋值。使用干er代码(Don'tRepeatY我们自己)

  • 此外,由于不应用进一步的计算,因此无需将大多数表单textbox和combobox值分配给单独的字符串变量。在查询中直接使用控件值

  • 对任何数据库(Postgres、SQL Server、Oracle、SQLite等)使用参数化(行业最佳实践),这不仅适用于MS Access,而且适用于在应用层(VBA、Python、PHP、Java等)中使用动态SQL的任何地方。您可以避免注入和任何混乱的报价箱和数据连接

    虽然语言有不同的方法将值绑定到参数,但MS Access中的一种方法是如下所示使用

  • 使用
    参数
    子句将查询保存为存储对象(仅符合MS Access SQL方言)。这有助于从数据中抽象代码

  • 最后,正确使用更新查询语法:
    updateset=…

  • 插入SQL查询(带参数化,保存一次为存储查询)

    参数成员参数文本、办公室参数文本、等级参数文本、操作类型参数文本、,
    RLA_参数文本、MQT_程序_参数文本、MQT_位置_参数TXT;
    插入[名册](成员、办公室、职级、OPTYPE、RLA、[MQT-PROGRAM]、[MQT-POSITION])
    值(成员参数、办公室参数、等级参数、操作类型参数、,
    RLA_参数、MQT_程序_参数、MQT_位置_参数);
    
    更新SQL查询(使用参数化,一次保存为存储查询)

    参数成员参数文本、办公室参数文本、等级参数文本、操作类型参数文本、,
    RLA_参数文本、MQT_程序_参数文本、MQT_位置_参数TXT;
    更新[名册]
    设置成员=成员参数,办公室=办公室参数,等级=等级参数,
    OPTYPE=OPTYPE_-Param,RLA=RLA_-Param,[MQT-PROGRAM]=MQT_-PROGRAM_-Param,
    [MQT-POSITION]=MQT_位置_参数;
    
    VBA(未显示SQL)

    name作为字符串,myquery作为字符串,mymsg作为字符串
    Dim qdef作为QueryDef
    '-如果为空,则将中间名设置为NMI
    如果IsNull(Me.txtMidInit.Value),则
    Me.txtmidini.Value=“NMI”
    如果结束
    '-创建所有大写的成员名称字符串
    mbrName=UCase(Me.txtLastName.Value&“,”&Me.txtLastName.Value&“&Me.txtmidini)
    如果Me.opgmnglotster.Value=1,则
    myquery=“MyRosterinerQuery”
    mymsg=“添加:”&mbrName
    其他的
    myquery=“MyRosterUpdate查询”
    mymsg=“更新:”&mbrName
    如果结束
    '分配给存储查询
    Set qdef=CurrentDb.querydfs(myquery)
    “绑定参数
    qdef!成员参数=mbrName
    qdef!OFFICE_Param=Me.cbxOffice.Value
    qdef!RANK_Param=Me.cbxRank.Value
    qdef!OPTYPE_Param=Me.cbxOpType
    qdef!RLA_Param=Me.cbxRLA.Value
    qdef!MQT_PROGRAM_Param=Me.cbxMQT.Value
    qdef!MQT_POSITION_Param=Me.cbxTngPos.Value
    qdef.executedbfailonerror
    “-确认消息
    MsgBox mymsg,vb信息
    设置qdef=Nothing
    
    Check update statement您正在使用类似于insert的语句,有关使用参数化查询的AxisLookup文档,而不是像这样手动连接字符串。那是一种可怕的离开方式