来自 SQL 记录集对象的记录中的字符串字段未正确比较 VBA

String fields from Records from a SQL Recordset Object not Comparing Correctly VBA

提问人:Dadams 提问时间:10/12/2023 最后编辑:Dadams 更新时间:10/13/2023 访问量:99

问:

我正在从一个表中检索记录,该表需要查看包含字符串值的列,以便将计数分配给特定字段的类。目前,我只使用一系列简单的硬编码 if 语句,这些语句比较当前记录返回的字符串值和我预设的字符串值。执行代码时,它会传递 if 语句,该语句显然分配了相同的字符串值。以下代码示例

Dim dbRecord as recordset
Dim sqlString as String
Dim connectionString as string
Dim tmp as string
Dim testVals as new ValClass

connectionString = "example"
sqlString = "Select PCS, StrVal From valTable"

With dbRecord
    .ActiveConnection connectionString
    .Openrecordset sqlString
End With
Do While Not dbRecord.EOF
   tmp = dbRecord!StrVal.Value
   if tmp = "8_6" then
      testVals.v86 = dbRecord!PCS.value
   end if 
   if tmp = "9" then
      testVals.v9 = dbRecord!PCS.value
   end if
   if tmp = "9_6" then
      testVals.v96 = dbRecord!PCS.value
   end if
dbRecord.movenext
Loop
dbRecord.close

strVal 是我数据库中的 nvarchar(50)。我相信有更好的方法可以解决这个问题,但这让我感到困惑。我想知道为什么会这样?任何答案都值得赞赏!

谢谢

SQL VBA MS-ACCESS

评论

2赞 Jonathan Willcock 10/12/2023
我怀疑下划线是问题所在。在 Unicode (nvarchar) 中,有多个下划线。若要测试失败的值,您认为它应该成功的地方,请尝试检查第二个字符的 ASCII 值(ASC() 函数)与“_”的 ASC 进行比较。顺便说一句,使用而不是连续的 ,或者至少使用 ,否则即使成功了,所有测试也会被检查。Select CaseIf ..End IfElseIf
0赞 Dadams 10/12/2023
我的坏,我忘了把它添加到我的例子中。同样的事情也发生了。@HansUp
0赞 Kostas K. 10/12/2023
可能与错误无关,但在引用记录集字段时,bang 运算符会跟随字段的名称。所以,要么要么.看这个:support.microsoft.com/en-au/office/...!dbRecord!StrValdbRecord("StrVal").Value
0赞 Dadams 10/13/2023
感谢您的所有反馈,我将测试所有这些
0赞 June7 10/13/2023
你有每个代码模块的顶部吗?你声明,但你使用 .其中之一是您的实际代码或已发布的代码中的拼写错误。Option ExplicitdbRecord1dbRecord

答:

1赞 FunThomas 10/13/2023 #1

数据库中的字符串与用于比较的字符串之间一定存在差异(您可以放心地假设 VBA 不会判断错误......但是,有时很难看出区别。可能是下划线字符不同,或者字符串中有不可见的字符(空白、Cr、Lf 或一些特殊的其他字符)。

在这种情况下,我使用一个小例程将所有字符及其 Ascii 值转储到即时窗口:

Sub DumpString(s As String)
    Dim i As Long
    For i = 1 To Len(s)
        Dim c As String
        c = Mid(s, i, 1)
        Debug.Print i, AscW(c), c
    Next
End Sub

例如,在代码中编写。如果是,它会显示DumpString tmp"8_6"

 1    56    8
 2    95    _
 3    54    6

如果它显示不同的东西,它会解释为什么失败。If

免责声明:我已经在 SO 的答案中至少使用过一次这个例程,但找不到它。

评论

0赞 Dadams 10/13/2023
谢谢,这确实是问题所在!出于某种原因,它在最后添加了一个空格。