-
Здравствуйте!
Мне нужно в качестве 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-запроса.
Если кто сталкивался, подскажите пожалуйста, в чём может быть причина ошибки.
-
> ADORecordset: Recordset;
ADORecordset: _recordset;
?
-
Спасибо за вариант, но проблема не в этом, да и в 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 - абсолютно разные вещи.
|