VBA SQL无法识别已分配的变量

时间:2015-08-27 23:18:54

标签: sql vba ms-access access-vba

我觉得事情总是比他们真正需要的更复杂。

我也觉得这很可能完全取决于我自己缺乏的经验......

目的:
我再次通过调酒师从MS Access打印东西。我现在被要求创建一个表单,用户可以在其中输入Material#以及与该数字相关联的线数,然后打印出每个线的标签,同时读取Material和Wire#。

步骤:
我正在外国数据库中使用一个表,Bartender从中获取其数据进行打印。我有一个SQL语句来清除该表,然后是另一个用DO ... UNTIL循环中的相关信息填充它。

代码:

Private Sub Next_Click()

Dim PrintLabel As Variant
Dim ClearTable As String
Dim FillTable As String

    Dim strMaterial As String
    Dim intWire As Integer
    Dim i As Integer
    strMaterial = [txtMaterial]
    intWire = [txtWire]
    i = 1

    DoCmd.SetWarnings False

    ClearTable = "DELETE * from G:\OPS\ZShared\PrintData.accdb.PrintData"

    DoCmd.RunSQL ClearTable

    Do

         FillTable = "INSERT INTO G:\OPS\ZShared\PrintData.accdb.PrintData ([Material], [Wire #]) VALUES (strMaterial, intWire)"

         DoCmd.RunSQL FillTable

         intWire = intWire - 1

    Loop Until intWire = 0

    PrintLabel = Shell("C:\Program Files (x86)\Seagull\Bartender Suite\bartend.exe /F=G:\OPS\ZShared\Tags.btw /P /X")
    DoCmd.SetWarnings True

    DoCmd.Close

End Sub

问题:
当我运行它时,它执行正常,直到我进入DO ... UNTIL循环。从那里,它提示我输入strMaterial和intWire直到王国来,这意味着它在某种程度上正在丢弃或忽略我在代码中早先给这两个变量赋予的赋值。

潜在兴趣点 对于intWire,输入1和0都不会导致循环中断,也不会在正确的迭代次数开始后中断。此外,在strMaterial和intWire的提示中输入的任何数据都将按原样写入外部数据库。

谢谢!

1 个答案:

答案 0 :(得分:0)

"INSERT INTO PrintData ([Material], [Wire #]) VALUES (strMaterial, intWire)"

当strMaterial和intWire成为Sql字符串的一部分时,Access假定它们是参数并询问您的值。

你想做什么:

"INSERT INTO PrintData ([Material], [Wire #]) VALUES ('" & strMaterial & "', " & intWire & ")"

因此变量的值在Sql字符串中使用,而不是它们的名称 strMaterial必须包含在''''因为它是一个字符串。

甚至更好:创建参数化查询而不是构造动态Sql字符串,以避免Sql注入。