Я конвертирую приложение из BDE в ADO.
В 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;