Конференция "Базы" » ADO: использование Command в качестве source для Recordset [D7, ADO]
 
  • Alexander © (15.07.09 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 © (15.07.09 10:11) [1]

    > ADORecordset: Recordset;


    ADORecordset: _recordset;

    ?
  • Alexander © (15.07.09 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 - абсолютно разные вещи.
 
Конференция "Базы" » ADO: использование Command в качестве source для Recordset [D7, ADO]
Есть новые Нет новых   [134474   +35][b:0][p:0]