ms-Access正在从字符串中删除前导零

时间:2018-01-16 17:07:58

标签: ms-access vb6

在下面的代码中,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。

为什么会这样做?我该如何阻止它呢?

1 个答案:

答案 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