Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.14;
Скачать: CL | DM;

Вниз

ADO: использование Command в качестве source для Recordset   Найти похожие ветки 

 
Alexander ©   (2009-07-15 10:00) [0]

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

Мне нужно в качестве 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-запроса.

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


 
Ega23 ©   (2009-07-15 10:11) [1]


> ADORecordset: Recordset;


ADORecordset: _recordset;

?


 
Alexander ©   (2009-07-15 12:42) [2]

Спасибо за вариант, но проблема не в этом, да и в 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 - абсолютно разные вещи.



Страницы: 1 вся ветка

Текущий архив: 2010.11.14;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.007 c
2-1282059473
2expres
2010-08-17 19:37
2010.11.14
Mediaplayer и .wav


6-1220980433
dmitry_12_08_73
2008-09-09 21:13
2010.11.14
Шаринг изображений с использованием сервисов SCP/SFTP, HTTP...


15-1281007126
Дмитрий С
2010-08-05 15:18
2010.11.14
ММП не ожидается в бл. будущем?


2-1282107940
TyTuk
2010-08-18 09:05
2010.11.14
Перемещения файлов с нужным расширением.


3-1247562063
ziArt
2009-07-14 13:01
2010.11.14
Сортировка и SQL