在下面的代码中,skuSet.Fields(0)
(数据库中的文本字段)的值为“000000002”。
If skuSet.RecordCount = 0 Then
sql = "SELECT Stock_Code FROM Stock WHERE Stock_Code = '" & stkLine.StockCode & "'"
Set skuSet = dbStock.OpenRecordset(sql, dbOpenDynaset)
End If
sql = "SELECT * FROM PickedByPicco WHERE OrderID = " & stkLine.OrderId & " AND StockCode = '" & skuSet.Fields(0) & "'"
Set SOPSLineSet = dbSOPS.OpenRecordset(sql, dbOpenDynaset)
If SOPSLineSet.RecordCount = 0 Then
sql = "INSERT INTO PickedByPicco(OrderID, StockCode, Qty, ScannedBy, ProcessedBy, processed) VALUES(" & stkLine.OrderId & _
", " & skuSet.Fields(0) & ", " & stkLine.Quantity & ", '" & stkLine.UserId & "', '', False)"
dbSOPS.Execute (sql)
当我单步执行代码时,skuSet.Fields(0)
中的值仍然与预期的相同。
执行查询后,我会检查PickedByPicco
表,而StockCode
字段只显示值2,并删除所有前导0。
为什么会这样做?我该如何阻止它呢?
答案 0 :(得分:4)
那是因为您的INSERT语句如下所示:
INSERT INTO PickedByPicco (...) VALUES (..., 000000002, ...)
它应该是这样的:
INSERT INTO PickedByPicco (...) VALUES (..., '000000002', ...)
(注意你的价值附近的报价。)
通常情况下,我会告诉您使用参数化SQL,因为SQL creation by string concatenation is evil,但不幸的是,DAO的Database.Execute
不支持这一点。所以,下一个最好的事情是正确地逃避字符串。要做到这一点:
即。这一行
", " & skuSet.Fields(0) & ", " & ...
成为
", '" & Replace(skuSet.Fields(0), "'", "''") & "', " & ...
当你在这里时,一定要替换其他字符串中的单引号!目前,O'Brien
的UserId会破坏您的SQL,other values might do worse。