응용 프로그램을 BDE에서 ADO로 변환 중입니다.어떻게해야합니까?
BDE에서 쿼리가 열려 있고 "Sql.Clear"를 호출하면 자동으로 데이터 집합을 닫습니다.
그러나 TADOQuery에서는 "닫힌 데이터 집합에서 작업을 수행 할 수 없습니다."라는 예외가 발생합니다.
많은 레거시 코드가 이전 BDE 동작에 의존하므로 아래 예제와 같이 런타임 오류가 많습니다.
내 TADOCustomQuery 클래스의 Sql.Clear 메서드를 재정의하여 ".Close"명령을 포함하려고합니다. 어떻게해야합니까?
".Clear"메서드는 TWideStrings 형식의 SQL 속성에 있습니다. 내 진짜 질문은 : 어떻게 내가 TideOQuery의 자손에 TWideStrings.Clear 메서드를 재정의 할 수 있습니까?
I는 SQL 속성에 대한이와 이미 사용자 정의 TADOQuery 구성 요소를 가지고 : 여기
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