VBA无法从ADODB.RecordSet获取带CustomerName条件的记录数
问题解决思路
核心问题定位
手动执行的SQL里CustomerName like 'Test*'带了通配符*,但你的VBA代码拼接的变量nameStartsWithLetter大概率没加这个通配符,导致拼接后的SQL变成精确匹配like 'Test',自然查不到数据。另外直接字符串拼接还可能碰到单引号转义、日期格式不兼容的问题,推荐用参数化查询彻底规避这类问题。
方案1:修正字符串拼接(快速临时修复)
给变量补上通配符*,同时用&代替+拼接字符串(+在VBA里会因空值导致拼接失败,&更稳定):
Dim objReprtRecsetCnt As ADODB.Recordset Dim cntqry As String ' 给变量添加通配符*,对齐手动查询的逻辑 cntqry = "SELECT Count(ID) FROM Reports WHERE Active = 1 And CustomerName like '" & Replace(CStr(nameStartsWithLetter), "'", "''") & "*' And CreatedDate >= #" & Format(fromDate, "yyyy-mm-dd") & "# And CreatedDate <= #" & Format(toDate, "yyyy-mm-dd") & "#" With objReprtRecsetCnt .ActiveConnection = dbConnection .Source = cntqry .LockType = adLockReadOnly .CursorType = adOpenForwardOnly .Open End With cnt = objReprtRecsetCnt.Fields(0).Value objReprtRecsetCnt.Close
注:如果nameStartsWithLetter包含单引号(比如O'Neil),要用Replace把单引号转成双引号,避免SQL语法报错。
方案2:参数化查询(推荐,更安全可靠)
用ADODB.Command绑定参数,彻底避免字符串拼接的各种问题:
Dim objCmd As ADODB.Command Dim cnt As Long Set objCmd = New ADODB.Command With objCmd .ActiveConnection = dbConnection .CommandText = "SELECT Count(ID) FROM Reports WHERE Active = 1 And CustomerName like ? And CreatedDate >= ? And CreatedDate <= ?" .CommandType = adCmdText ' 参数顺序要和SQL里的?一一对应 .Parameters.Append .CreateParameter("pName", adVarChar, adParamInput, 255, nameStartsWithLetter & "*") .Parameters.Append .CreateParameter("pFromDate", adDate, adParamInput, , fromDate) .Parameters.Append .CreateParameter("pToDate", adDate, adParamInput, , toDate) ' 执行查询并直接获取结果 cnt = .Execute.Fields(0).Value End With Set objCmd = Nothing
这种写法不需要处理单引号转义、日期格式转换,还能防止SQL注入,是更规范的数据库操作方式。
内容的提问来源于stack exchange,提问作者Sunil G.V.
相关产品推荐
相关产品推荐

