1

Тема: Ошибка ADODB.Recordset: Аргументы имеют неверный тип

Пытаюсь получить из базы SQL данные для того чтобы потом их выводить в Excel. Я получаю Recordset из одной таблицы базы, а потом из другой таблицы той же базы. Проблема в том, что таблицы устроены по-разному и первую таблицу я беру как есть, а во второй мне нужно искать соответствующие записи. Метод Recordset.Find не работает, если Recordset получен с помощью Connection.Execute. И я пытаюсь создать второй Recordset с помощью Recordset.Open:

Set objSQLServer = CreateObject("ADODB.Connection")                
Set RS1 = CreateObject("ADODB.Recordset")                                        
Conn_string = "Driver={SQL Server};Server=DB1;database=E3v2011;Trusted_Connection=true"  

objSQLServer.Open Conn_string
                                            
Cmd_string = "SELECT ENTRY, Version, VersionText, LASTUPDT, Class, Description, Supplier, ArticleNumber, ENTRYTYP, DeviceLetterCode, Flags  FROM ComponentData ORDER BY ENTRY"        

Set RS = objSQLServer.Execute (Cmd_string, adCmdText) 

Cmd_string1 = "SELECT ENTRY, AttributeName, AttributeValue   FROM ComponentAttribute WHERE AttributeName='D2K_Dev_Sub_Class' OR AttributeName='D2K_1C_Code' OR AttributeName='Name_1C' OR AttributeName='Naimenovanie_V4' OR AttributeName='Marka' OR AttributeName='Block_E2' OR AttributeName='Complect' OR AttributeName='D2K_Status' OR AttributeName='SubSystem' ORDER BY ENTRY"

RS1.Open Cmd_string1, objSQLServer, adOpenKeyset, adLockOptimistic, adCmdText

В результате появляется ошибка:
Error: Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
Code: 800A0BB9
Source: ADODB.Recordset
System: Указанный драйвер принтера занят.

При этом вариант с Connection.Execute для обеих таблиц работает:

Set objSQLServer = CreateObject("ADODB.Connection")                

Conn_string = "Driver={SQL Server};Server=DB1;database=E3v2011;Trusted_Connection=true"  

objSQLServer.Open Conn_string
                                            
Cmd_string = "SELECT ENTRY, Version, VersionText, LASTUPDT, Class, Description, Supplier, ArticleNumber, ENTRYTYP, DeviceLetterCode, Flags  FROM ComponentData ORDER BY ENTRY"        

Set RS = objSQLServer.Execute (Cmd_string, adCmdText) 

Cmd_string1 = "SELECT ENTRY, AttributeName, AttributeValue   FROM ComponentAttribute WHERE AttributeName='D2K_Dev_Sub_Class' OR AttributeName='D2K_1C_Code' OR AttributeName='Name_1C' OR AttributeName='Naimenovanie_V4' OR AttributeName='Marka' OR AttributeName='Block_E2' OR AttributeName='Complect' OR AttributeName='D2K_Status' OR AttributeName='SubSystem' ORDER BY ENTRY"

Set RS1 = objSQLServer.Execute (Cmd_string1, adCmdText) 

Что я не так делаю в первом варианте?

2

Re: Ошибка ADODB.Recordset: Аргументы имеют неверный тип

RS1.Open Cmd_string1, objSQLServer, adOpenKeyset, adLockOptimistic, adCmdText

Экспериментально не проверял, но судя по документации...
Open Method on a Recordset Object (ADO)

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Source
This optional parameter specifies a Variant that evaluates to a valid Command object variable name or a valid string specifying the command text specific to the Microsoft OLE DB Provider for AS/400 and VSAM to open a data file on the host.

Если мой английский меня не подводит, то Source это не переменная типа string, а объект типа ADODB.Command. Скорее всего это и есть причина ошибки - "Аргументы имеют неверный тип".

Соответственно нужно перед открытием рекордсета добавить что-то такое:


Dim oCommand
Set oCommand = CreateObject("ADODB.Command")
oCommand.ActiveConnection = objSQLServer
oCommand.CommandText = "SELECT ENTRY, AttributeName, AttributeValue   FROM ComponentAttribute WHERE AttributeName='D2K_Dev_Sub_Class' OR AttributeName='D2K_1C_Code' OR AttributeName='Name_1C' OR AttributeName='Naimenovanie_V4' OR AttributeName='Marka' OR AttributeName='Block_E2' OR AttributeName='Complect' OR AttributeName='D2K_Status' OR AttributeName='SubSystem' ORDER BY ENTRY"
oCommand.CommandType = adCmdText

И при открытии рекордсета передавать туда объект:

RS1.Open oCommand, objSQLServer, adOpenKeyset, adLockOptimistic, adCmdText