提问人:Dadams 提问时间:10/12/2023 最后编辑:Dadams 更新时间:10/13/2023 访问量:99
来自 SQL 记录集对象的记录中的字符串字段未正确比较 VBA
String fields from Records from a SQL Recordset Object not Comparing Correctly VBA
问:
我正在从一个表中检索记录,该表需要查看包含字符串值的列,以便将计数分配给特定字段的类。目前,我只使用一系列简单的硬编码 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)。我相信有更好的方法可以解决这个问题,但这让我感到困惑。我想知道为什么会这样?任何答案都值得赞赏!
谢谢
答:
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
谢谢,这确实是问题所在!出于某种原因,它在最后添加了一个空格。
评论
Select Case
If ..End If
ElseIf
!
dbRecord!StrVal
dbRecord("StrVal").Value
Option Explicit
dbRecord1
dbRecord