Форум: "Базы";
Текущий архив: 2010.11.14;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c