Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.006 c
2-1281961993
12
2010-08-16 16:33
2010.11.14
как AnsiUpperCase для одного символа на русском?


15-1280438963
Германн
2010-07-30 01:29
2010.11.14
W7 90-days trial version


3-1247500268
AndrewG
2009-07-13 19:51
2010.11.14
Blob &amp; TOleContainer


2-1282026902
CuTTer
2010-08-17 10:35
2010.11.14
шрифты


15-1280694604
Юрий
2010-08-02 00:30
2010.11.14
С днем рождения ! 2 августа 2010 понедельник




   Наверх