使用带参数的ADODB.Command时,有没有更好的方法来避免错误?

时间:2012-01-10 19:37:38

标签: vba ado

我有一些现有的VBA代码正在使用字符串连接构建查询。我更新了代码以使用带有参数的命令对象,但之后每隔一段时间就开始收到一个错误String data, right truncation。在调查之后,我发现如果我的字符串集合以小于其余字符串的字符串开头,那么当它到达更长的字符串时它将失败。为了使它工作,我只是添加了一些代码来从最大到最小的排序集合。这个例子很容易,因为我知道我不会有多个字符串,但如果我有更多的字符串集合,那可能是个问题。

除了整理收藏品之外还有其他方法吗?以下是导致问题的代码部分。

Dim lineNumbers As New Collection
Dim cnDb as new ADODB.Connection
Dim cmd as new ADODB.Command
Dim rs as new ADODB.RecordSet

lineNumbers.Add "001-3""-5116323-ABA"         
lineNumbers.Add "001-1""-5116327-ABA-1 1/2""C"  ' If not sorted, it fails when it tries this one
lineNumbers.Add "001-1""-5116327-ABA"
lineNumbers.Add "001-1""-5116327-ABA-1""C"

sQry = "SELECT COUNT(commondatalink) FROM commondata WHERE reportedlineno = ?"
cmd.ActiveConnection = cnDb
cmd.CommandText = sQry
cmd.CommandType = adCmdText

For i = 1 To lineNumbers.Count
    Set rs = cmd.Execute(, Array(lineNumbers(i))) ' Error thrown here on unsorted list
    If rs(0) > 1 Then
    ' do something...
    End If
Next i

1 个答案:

答案 0 :(得分:0)

似乎你无法重复使用这样的命令对象:第一次运行它可能会推断参数类型/长度,如果后续调用使用更长的值来触发错误。

您可以尝试使用cmd.CreateParameter()显式创建参数,并将大小设置为要查询的字段的大小(或稍大)