代码之家  ›  专栏  ›  技术社区  ›  Tam N.

在使用vba创建的sql中是否有错误?

  •  0
  • Tam N.  · 技术社区  · 15 年前

    我不明白为什么这个查询不起作用。我用 msgbox 显示我的 strSQL ,但在我看来很好。

    Dim strSQL As String
    strSQL = "INSERT INTO Jobs (Date, RefNo, ProjectID, PManager, PDesc, PONo, Src_Qty, WC_Qty, Rate, Total, Note, Company) "
    strSQL = strSQL & "VALUES (" & JobDate.Value & ", '" _
                                & Text41.Value & "', '" _
                                & ProjectID.Value & "', '" _
                                & PManager.Value & "', '" _
                                & PDesc.Value & "', " _
                                & Text43.Value & ", " _
                                & Src_Qty.Value & ", " _
                                & WC_Qty.Value & ", " _
                                & newRate.Value & ", " _
                                & ProjTotal.Value & ", '" _
                                & Text38.Value & "', '" _
                                & newCompany.Value _
                                & "');"
    MsgBox (strSQL)
    DoCmd.RunSQL strSQL
    
    5 回复  |  直到 13 年前
        1
  •  3
  •   HansUp    15 年前

    添加一行:

    Debug.Print strSQL
    

    之后

    MsgBox (strSQL)
    

    转到即时窗口(ctrl+g)并复制完成的sql语句。然后创建一个新查询,切换到sql视图,并粘贴到sql语句中。找出声明失败的原因。我认为如果jobs表中的“date”字段是日期/时间数据类型,那么klabranche就是在赚钱。如果无法识别问题,请编辑问题以显示失败的SQL语句,并告诉我们作业字段的数据类型。

    此外,jobs表还包含3个字段,这些字段的名称是保留字:date、rate和note。(见 http://allenbrowne.com/AppIssueBadWord.html )如果保留这些字段名,请至少用方括号将其括起来,以避免混淆访问:

    strSQL = "INSERT INTO Jobs ([Date], RefNo, ...
    
        2
  •  7
  •   Kevin LaBranche    15 年前

    如果我没记错的话,你需要用英镑来包装你的约会。

    "VALUES (#" & JobDate.Value & "#, '" _
    

    我想你不需要在结尾加分号…

        3
  •  2
  •   Tony Toews    15 年前

    除了在klabranche提到的日期周围使用delimeters之外,还应该使用明确的日期格式。请使用格式(jobdate,“yyyy-mm-dd”)使用yyy-mm-dd的ISO标准,或参见 Return Dates in US #mm/dd/yyyy# format

    再次检查测试字段周围是否使用引号,数字字段周围是否没有引号。projectid可能是数字,也可能是文本。

    我将重命名表单上的text43和test48字段,以便更清楚地知道它们是什么。假设这是绑定表单,可以将它们设置为与字段相同的名称。

    您不需要使用.value属性。

    docmd.runsql的问题是它忽略任何错误。以下任一项将显示查询接收到的任何错误消息。如果使用dao,则使用currentdb.execute strsql,dbfailonerror..对于ADO使用CurrnEngutix.Calnal.ExtReSt命令,LngReordOrdSffEffice,AdCMdTeXT,您可以删除DOMM.StaveWrices线(如果有的话)。

    如果要使用docmd.setwarnings,请确保将true语句也放入任何错误处理代码中。否则以后可能会发生奇怪的事情,尤其是当你在开发应用程序时。例如,如果关闭一个对象,您将不再收到“是否保存更改”消息。这可能意味着不需要的更改、删除或添加将保存到MDB中。

    两种方法之间的性能也可以显著不同。一篇文章说currentdb.execute花了2秒,而docmd.runsql花了8秒。像往常一样。

    hansup在使用保留字段名方面有一个很好的优点。参观 Tony's Table and Field Naming Conventions

        4
  •  0
  •   Oorang    15 年前

    我同意klabranche的观点,最可能的罪魁祸首是你需要在日期值周围加上哈希标记(“”)。不过,作为该思想的补充,如果使用currentdb.execute而不是docmd.runsql,则会向您提供一条信息性错误消息,告诉您具体是错误的。这将使调试 许多的 更容易的。希望能有帮助!

        5
  •  0
  •   Tam N.    15 年前

    更改字段名后,这就是我的strsql所说的:

    插入作业(jobdate、refno、projectd、pmanager、pdesc、pono、src_qty、wc_qty、jobRate、jobTotal、note、company)值(2009-09-20、'1'、'3'、'jean jou'、'4'、2、5、6、7、42、'9'、'magnus')

    我已经多次检查了我的文本字段,它们是正确的。

    IAM获取“运行时错误:3134,insert into语句中的语法错误”,而不考虑do.cmd或currentdb.execute

    谢谢伙计们。