ADO Failing Второй раз через цикл - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть приложение Access (Access Front-end, SQL backend с использованием связанных таблиц), и у меня возникла эта проблема: пользователь вводит номер детали. Затем они входят в количестве. В новой бизнес-логике c говорится, что я должен сравнить этот номер детали с таблицей, чтобы узнать, цитировали ли мы его клиенту в течение прошлого года. Если у нас есть, мы можем процитировать это сейчас; если нет, мы должны отклонить часть. Когда программа была изначально написана, они использовали формат таблицы данных, чтобы позволить пользователю скопировать из Excel список деталей, вставить их в таблицу данных, а затем скопировать и вставить в список количеств. Как только количество введено / вставлено для строки, эта строка обрабатывается. Если я вручную ввожу номер детали, то количество, необходимый код проверяет, был ли номер детали процитирован в течение последнего года, и все ли хорошо. Но если я копирую и вставляю в список частей, первый раз в процессе он работает нормально; но каждый второй раз терпит неудачу. Вот базовый c код:

Dim cn21 As ADODB.Connection
Set cn21 = New ADODB.Connection
Dim strsql21 As String
Dim cm21 As New ADODB.Command
Dim rs21 As New ADODB.Recordset


' gblODBCString = "ODBC;Description=PartsPortalsSql;DRIVER=SQL Server;SERVER=db-TEST-partsptl-primary;Trusted_Connection=Yes;APP=Microsoft Office 2010;DATABASE=PartsPortalSQL;"

cn21.Open gblODBCString


cm21.ActiveConnection = cn21

' All I want to know is how many records there are for this part within the last year...

strsql21 = "Select count(*) from tblQuoteDetail tqd INNER JOIN tblQuotes tq on tqd.quoteid = tq.quoteid WHERE " _
   & " tqd.qdetailpartno = '" & Me.QDetailPartNo & "' AND tq.quotesentdate >= '" & OneYearAgo & "' AND tqd.qdetailunitprice > 0"
cm21.CommandText = strsql21

Set rs21 = New ADODB.Recordset
Set rs21 = cn21.Execute(strsql21, varparams, adCmdText)

If rs21(0) = 0 Then   ' nothing found! can't be escalated...

blah blah blah...

end if

' done with this part... clean up

Set cm21 = Nothing
rs21.Close
Set rs21 = Nothing
Set cn21 = Nothing

Затем он вернется сюда, когда перейдет к следующей части ... Но если я сделаю это вручную, он будет работать нормально. Но когда он проходит через l oop частей, он попадает в строку: Set rs21 = cn21.Execute (strsql21, varparams, adcmdtext) и занимает около 30 секунд для «обработки / тайм-аута», а затем rs21 (0) возвращает «Ошибка времени выполнения '3265': элемент не может быть найден в коллекции, соответствующей запрошенному имени или порядковому номеру."

Я проверил, что каждое поле в запросе sql заполнено правильно , Я никогда не сталкивался с этой проблемой раньше.

Другие вещи, которые я пытался - использовать DAO вместо ADODB ... не повезло ...

Если у кого-то есть предложения, я все уши ... кроме как взорвать его ... Я нахожусь в стадии тестирования замены версии, которая не использует эту функцию копирования / вставки. Но до выпуска еще месяц или два.

Спасибо

Access 2016, Связанные таблицы с Microsoft SQL Server 2016 Я полагаю ... Windows 10 64 bit Также работает на VPN, подключенная к VDI.

1 Ответ

0 голосов
/ 21 апреля 2020

Я полагаю, вы используете неправильные команды для проверки наборов записей. Я могу ошибаться, потому что я не использую ADO так часто, как следовало бы, но вот мой шаблон для этого, если вам все понравится

'needs the MSO AtiveX Data Objects Library
Dim vbSql As String, cnnstr  as string
Dim cnn As ADODB.Connection
Dim rs As New ADODB.Recordset

vbSql = "SELECT ;"
Set cnn = New Connection
cnnstr = ""
cnn.Open cnnstr
rs.CursorLocation = adUseClient
rs.Open vbSql, cnn
cnn.Close
Set cnn = Nothing
...