Ich konvertiere eine Anwendung von BDE zu ADO.Wie kann ich das in Delphi machen?
Wenn unter der BDE eine Abfrage geöffnet war und Sie "Sql.Clear" aufgerufen haben, wurde das Dataset automatisch geschlossen.
Dies ist jedoch nicht der Fall unter TADOQuery, wo es eine Ausnahme erhöhen wird „Operation kann nicht auf einem geschlossenen Datensatz durchgeführt werden“.
Viele unserer Legacy-Code basiert auf dem alten BDE Verhalten, so dass ich eine Menge von Laufzeitfehlern von Code wie das Beispiel unten.
Ich mag die Sql.Clear Methode meiner TADOCustomQuery Klasse außer Kraft zu setzen, so dass es einen „.Close“ Befehl umfasst. Wie kann ich das machen?
Die „.Clear“ Methode ist auf der SQL-Eigenschaft, die vom Typ TWideStrings ist. Meine eigentliche Frage ist: Wie kann ich die TWideStrings.Clear-Methode für einen Nachkommen von TADOQuery überschreiben?
Ich habe eine maßgeschneiderte TADOQuery Komponente bereits mit dieser für die SQL-Eigenschaft:
property SQL: TWideStrings read GetSQL write SetSQL;
Hier einige Code wird das Problem, das ich habe zu demonstrieren:
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;
Ja, ich weiß das ... aber ich hoffe, dass ich diese Zeile nicht zu 100s von existierenden Orten in Code hinzufügen kann. – JosephStyons