Hallo,<br>
ich bin gerade dabei, eine Applikation von BDE (Paradox) auf ADO (Oracle8, MS-SQL2000, DB2 und SAP-DB) umzustellen. Mein Problem ist, dass es nahezu ständig zu Zugriffsverletzungen kommt, wenn ich mein Haupt-ADODataSet öffne.<br>
Über das ADODataSet gewinne ich aus mehreren Tabellen eine Datenmenge, wobei die Spalten von der durch den User gewählten Sicht abhängig sind (Auswahl per TDBLookupComboBox). Beim Ändern der Sicht wird das erforderliche SQL-Statement neu erzeugt (im Beispiel "mein_SQL_Statement"). Zusätzlich werden noch Calculated-Fields dem ADODataSet hinzugefügt.<br>
Wenn nun im Programm das ADODataSet wieder aktiviert wird, kommt es häufig zu Zugriffsverletzungen (z.B. "Lesen von Adresse 000000C3"). Der erste Aufruf funktioniert aber immer. <br>
Das Problem tritt auf unter Oracle8 und MS-SQL2000, clUseClient und clUseServer.<br>
(System: NT4.0, SP5 / SP6a / D5 Enterprise inkl. Update und ADOUpdate2)<br>
<br>
Hier der abgespeckte Sourcecode:<br>
<br>
<PRE>
...
with ADODataSet do
begin
Close; // DataSet schliessen
CommandText := mein_SQL_Statement; // SQL-Statement schreiben
FieldDefs.Clear; // Felddefinitionen löschen
Fields.Clear; // Felder löschen
FieldDefs.Updated := false; // Felddefinitionen sollen ungedated werden
FieldDefs.Update; // Felddefinitionen holen
for i := 0 to FieldDefs.Count-1 do
FieldDefs[i].CreateField(ADODataSet); // Felder erzeugen
for i := 0 to (Anz_Felder-1) do
Add_Field(ADODataSet,'Feld'+IntToStr(i),fkCalculat ed,ftString,
20,taLeftJustify); // berechnete Felder hinzufügen
try
open; // DataSet öffnen ==> hier knallt’s
except
...
end;
end;
...
//################################################## ####
// Feld anlegen
procedure Field_Add(DS:TDataSet; Feldname:String;
FK:TFieldKind; FT:TFieldType;
S:Integer;AL:TAlignment);
var
Field:TField;
begin
if DS.FindField(Feldname) = nil then
begin
with TStringField.Create(DS) do
begin
FieldName := Feldname;
DisplayLabel := Feldname;
FieldKind := FK;
Dataset := DS;
Name := Dataset.Name + Feldname;
Size := S;
Alignment := AL;
DS.FieldDefs.Add(Name, FT, Size,False);
end;
end;
end;
...
</PRE>
<br>
<br>
Habe ich etwas Elementares falsch gemacht oder liegt es an den ADO-Komponenten? Muss ich etwa auf _recordset-Ebene runter?<br>
Ich bin für jede Hilfe dankbar!<br>
<br>
Ulrich
ich bin gerade dabei, eine Applikation von BDE (Paradox) auf ADO (Oracle8, MS-SQL2000, DB2 und SAP-DB) umzustellen. Mein Problem ist, dass es nahezu ständig zu Zugriffsverletzungen kommt, wenn ich mein Haupt-ADODataSet öffne.<br>
Über das ADODataSet gewinne ich aus mehreren Tabellen eine Datenmenge, wobei die Spalten von der durch den User gewählten Sicht abhängig sind (Auswahl per TDBLookupComboBox). Beim Ändern der Sicht wird das erforderliche SQL-Statement neu erzeugt (im Beispiel "mein_SQL_Statement"). Zusätzlich werden noch Calculated-Fields dem ADODataSet hinzugefügt.<br>
Wenn nun im Programm das ADODataSet wieder aktiviert wird, kommt es häufig zu Zugriffsverletzungen (z.B. "Lesen von Adresse 000000C3"). Der erste Aufruf funktioniert aber immer. <br>
Das Problem tritt auf unter Oracle8 und MS-SQL2000, clUseClient und clUseServer.<br>
(System: NT4.0, SP5 / SP6a / D5 Enterprise inkl. Update und ADOUpdate2)<br>
<br>
Hier der abgespeckte Sourcecode:<br>
<br>
<PRE>
...
with ADODataSet do
begin
Close; // DataSet schliessen
CommandText := mein_SQL_Statement; // SQL-Statement schreiben
FieldDefs.Clear; // Felddefinitionen löschen
Fields.Clear; // Felder löschen
FieldDefs.Updated := false; // Felddefinitionen sollen ungedated werden
FieldDefs.Update; // Felddefinitionen holen
for i := 0 to FieldDefs.Count-1 do
FieldDefs[i].CreateField(ADODataSet); // Felder erzeugen
for i := 0 to (Anz_Felder-1) do
Add_Field(ADODataSet,'Feld'+IntToStr(i),fkCalculat ed,ftString,
20,taLeftJustify); // berechnete Felder hinzufügen
try
open; // DataSet öffnen ==> hier knallt’s
except
...
end;
end;
...
//################################################## ####
// Feld anlegen
procedure Field_Add(DS:TDataSet; Feldname:String;
FK:TFieldKind; FT:TFieldType;
S:Integer;AL:TAlignment);
var
Field:TField;
begin
if DS.FindField(Feldname) = nil then
begin
with TStringField.Create(DS) do
begin
FieldName := Feldname;
DisplayLabel := Feldname;
FieldKind := FK;
Dataset := DS;
Name := Dataset.Name + Feldname;
Size := S;
Alignment := AL;
DS.FieldDefs.Add(Name, FT, Size,False);
end;
end;
end;
...
</PRE>
<br>
<br>
Habe ich etwas Elementares falsch gemacht oder liegt es an den ADO-Komponenten? Muss ich etwa auf _recordset-Ebene runter?<br>
Ich bin für jede Hilfe dankbar!<br>
<br>
Ulrich
Comment