Я конвертирую приложение из BDE в ADO.Как я могу сделать это в Delphi?
Под BDE, если запрос был открыт, и вы вызвали «Sql.Clear», он автоматически закроет набор данных.
Однако это не относится к TADOQuery, где оно вызывает исключение «Операция не может выполняться на закрытом наборе данных».
Многие из наших устаревших кодов зависят от старого поведения BDE, поэтому я получаю много ошибок во время выполнения кода, как показано ниже.
Я хочу переопределить метод Sql.Clear моего класса TADOCustomQuery, чтобы он включал команду «.Close». Как я могу это сделать?
Метод «.Clear» относится к свойству SQL, которое имеет тип TWideStrings. Мой реальный вопрос: как я могу переопределить метод TWideStrings.Clear для потомка TADOQuery?
У меня есть настроенный компонент TADOQuery уже с этим для свойства SQL:
property SQL: TWideStrings read GetSQL write SetSQL;
Вот часть кода, чтобы продемонстрировать эту проблему у меня:
procedure TForm1.btnBDEDemoClick(Sender: TObject);
var
qryBDE: TQuery;
begin
//Both queries complete with no problem
qryBDE := TQuery.Create(nil);
try
with qryBDE do begin
DatabaseName := 'Test'; //BDE Alias
Sql.Clear;
Sql.Add('SELECT SYSDATE AS CURDAT FROM DUAL');
Open;
ShowMessage('the current date is: ' + FieldByName('CURDAT').AsString);
Sql.Clear; //<<<<<NO ERRORS, WORKS FINE
Sql.Add('SELECT SYSDATE-1 AS YESDAT FROM DUAL');
Open;
ShowMessage('And yesterday was: ' + FieldByName('YESDAT').AsString);
end; //with qryBDE
finally
FreeAndNil(qryBDE);
end; //try-finally
end;
procedure TForm1.btnADODemoClick(Sender: TObject);
const
c_ConnString = 'Provider=OraOLEDB.Oracle.1;Password=*;'+
'Persist Security Info=True;User ID=*;Data Source=*';
var
adoConn: TADOConnection;
qryADO: TADOQuery;
begin
//First query completes, but the second one FAILS
adoConn := TADOConnection.Create(nil);
qryADO := TADOQuery.Create(nil);
try
adoConn.ConnectionString := c_ConnString;
adoConn.Connected := True;
with qryADO do begin
Connection := adoConn;
Sql.Clear;
Sql.Add('SELECT SYSDATE AS CURDAT FROM DUAL');
Open;
ShowMessage('the current date is: ' + FieldByName('CURDAT').AsString);
Sql.Clear;//<<<<<<<<===========ERROR AT THIS LINE
Sql.Add('SELECT SYSDATE-1 AS YESDAT FROM DUAL');
Open;
ShowMessage('And yesterday was: ' + FieldByName('YESDAT').AsString);
end; //with qryADO
finally
FreeAndNil(qryADO);
FreeAndNil(adoConn);
end; //try-finally
end;
Да, я знаю, что ... но я надеюсь избежать добавления этой строки в 100 существующих мест в коде. – JosephStyons