Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO: использование Command в качестве source для Recordset [D7, ADO]


Alexander ©   (2009-07-15 10:00:00) 

Здравствуйте!

Мне нужно в качестве source для Recordset использовать Command (именно так, это позволяет использовать как настройки команды, так и настройки Recordset, связанные, например, с расположением и типом курсора и т.д.). Проблема возникает при выполнении следующего кода:

procedure TForm1.Button1Click(Sender: TObject);
var
 RecordsAffected: OleVariant;
 Parameters: OleVariant;
 ADORecordset: Recordset;
 ADOCommand: Command;
 ADOConnection: Connection;
begin
 try
   ADOConnection := CoConnection.Create;
   ADOConnection.Open('Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=E:\Work files\ADO\Database\db1.mdb;Persist Security Info=False', '', '', 0);
   ADOCommand := CoCommand.Create;
   ADOCommand.Set_ActiveConnection(ADOConnection);
   ADOCommand.CommandText := 'SELECT * FROM Table1';
   ADOCommand.CommandType := adCmdText;
   Parameters := varEmpty;
   ADOCommand.Execute(RecordsAffected, Parameters, 0); // работает
   ADORecordset := CoRecordset.Create;
   ADORecordset.Open(ADOCommand, varEmpty, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified); // получаем Exception
 except
   on E: Exception do
     MessageBox(Handle, PChar(E.Message), 'Error', 0);
 end;
end;

При вызове ADORecordset.Open показывается сообщение об ошибке:
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
В корректности большинчтва пеердаваемых аргументов нет особых сомнений, разве что на счёт varEmpty.

Я уже много чего попробовал: и параметры другие указывать (из соответствующих перечислений), и настройки команды и соединения менять - ничего не помогает.

В сети конкретно по использованию Command как source для Recordset тоже ничего не нашёл, во всех примерах в качестве source использую строку SQL-запроса.

Если кто сталкивался, подскажите пожалуйста, в чём может быть причина ошибки.


Alexander   (2009-07-15 12:42:00) [1]

Спасибо за вариант, но проблема не в этом, да и в ADODB_TLB.pas можно найти такую строчку:
Recordset = _Recordset;

С проблемой разобрался, дело в том, что вместо

ADORecordset.Open(ADOCommand, {-->} varEmpty {<--}, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified);

нужно было вызывать

ADORecordset.Open(ADOCommand, {-->} EmptyParam {<--}, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified);

А EmptyParam - глобальная переменная, объявленная в файле Variants.pas (инициализируется она так: SetClearVarToEmptyParam(TVarData(EmptyParam));)

Т.е., как оказалось, varEmpty и EmptyParam - абсолютно разные вещи.


Ega23   (2009-07-15 10:11:00) [2]


> ADORecordset: Recordset;


ADORecordset: _recordset;

?


Наверх

Титульная страница Поиск, карта сайта Написать письмо