Есть ли лучший способ избежать ошибки при использовании ADODB.Command с параметрами? - PullRequest
0 голосов
/ 10 января 2012

У меня был некоторый существующий код VBA, который строил запросы с использованием конкатенации строк. Я обновил код, чтобы вместо него использовать объект команды с параметром, но затем начал время от времени получать сообщение об ошибке «1001 *». Изучив его, я обнаружил, что если моя коллекция строк начинается со строки, меньшей, чем остальные, то произойдет сбой, когда она достигнет более длинной строки. Чтобы это работало, я просто добавил немного кода, чтобы отсортировать коллекцию от самой большой до самой маленькой. Это достаточно просто для этого примера, поскольку я знаю, что у меня будет не более нескольких строк, но если у меня когда-либо будет большая коллекция строк, это может быть проблемой.

Есть ли другой способ, кроме сортировки коллекции? Ниже приведен раздел кода, который вызывает проблему.

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 голосов
/ 11 января 2012

Похоже, что вы не можете повторно использовать объект команды, подобный этому: при первом запуске он может определить тип / длину параметра, и если последующий вызов использует более длинное значение, которое вызывает ошибку.

Вы можете попробовать явно создать параметр с помощью cmd.CreateParameter () и установить размер в соответствии с размером запрашиваемого поля (или немного больше)

...