Hallo Leute
Bei der Umsetzung habe ich die unten beschriebenen Probleme. Kennt jemand ein Beispiel, das zeigt, wie ich die Probleme lösen kann?
<PRE>
Vorgang:
- Ich öffne eine Access-DB mit der Funktion callDatabase und lese alle Datensätze
einzelner Tabellen mit der Funktion tryToReadDBwithDAO. Die Datensätze werden dann mit
z.B. der Funktion leseProfilwithDAO ausgewertet.
Der Programm-Benutzer soll gar nicht merken, dass die Daten aus einer DB kommen.
Er braucht auch keinerlei Datenbankspezifische visuelle Anzeige oder Auswahlmöglichkeit.
Die DB wird nur zur Datenhaltung verwendet. Ich muß die Daten mehrerer Tabellen ganz oder
teilweise auslesen, aufbereiten und dann dem Benutzer in Listen, StringGrid usw. zur Verfügung stellen.
Das funktioniert mit DAO auch ganz gut.
- Nun muß ich aber auf ADO umstellen.
Ich möchte am funktionierenden Code natürlich möglichst wenig ändern.
Die Verbindung zur Datenbank bekomme ich noch hin. Den Inhalt einer Tabelle kann
ich auch in ein DBGrid (Visible := FALSE) schreiben. Danach habe ich nur noch Probleme.
Ich weiss nicht, wie ich Daten anderer Tabellen (komplett oder selektiert) holen kann.
Fragen:
- muß ich unbedingt in ein DBGrid schreiben ?
- wie kann ich tryToReadDBwithADO eine Selektion mitgeben ?
- wie kann ich mit möglichst wenig Änderungen von DAO auf ADO umsteigen ?
-------------------------- DAO ------------------------------------------
function callDatabase(dbname: string): integer;
begin
result := 1;
try
DBEngine := CreateOleObject('DAO.DBEngine.36');
ws := DBEngine.Workspaces[0];
db := ws.OpenDatabase(dbname);
except
DBFehler;
result := 0;
end;
end;
function tryToReadDBwithDAO(sql: string; var rs: variant): integer;
begin
result := 1;
try
VarClear(rs);
rs := db.OpenRecordSet(sql,dbOpenDynaset);
rs.MoveFirst;
except
DBFehler;
result := 0;
end;
end;
procedure leseProfilwithDAO(tabname: string);
var
ok : integer;
breite : integer;
profil : string;
colname : string;
sel_str : string;
sql_str : string;
begin
sel_str := '*';
colname := 'profil';
sql_str := 'SELECT * FROM ' + tabname + ' WHERE ' + colname + ' LIKE ' + #39 + sel_str + #39;
ok := tryToReadDB(sql_str,rs1);
if (ok <= 0) then exit;
while not rs1.EOF do
begin
if VarIsNull(rs1.Fields['profil'].Value) then
profil := 'keine Angabe'
else
profil := rs1.Fields['profil'].Value;
if VarIsNull(rs1.Fields['breite'].Value) then
breite := 0
else
breite := StrToInt(rs1.Fields['breite'].Value);
Protokoll(Format('Profil=%s breite=%d',[profil,breite]));
rs1.MoveNext;
end;
end;
-------------------------- ADO ------------------------------------------
function tryToReadDBwithADO(dbname,tabname: string): integer;
begin
result := 1;
with Form1.ADOTable1 do
begin
try
Active := FALSE;
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source='
+ dbname
+ ';Mode=Read|Write|Share Deny None;Persist Security Info=False';
TableName := tabname;
Active := TRUE;
except
DBFehler;
result := 0;
exit;
end;
end;
end;
procedure leseProfilwithADO(dbname,tabname: string);
var
ok : integer;
breite : integer;
profil : string;
colname : string;
sel_str : string;
sql_str : string;
begin
sel_str := '*';
colname := 'profil';
sql_str := 'SELECT * FROM ' + tabname + ' WHERE ' + colname + ' LIKE ' + #39 + sel_str + #39;
ok := tryToReadDBwithADO(dbname,tabname);
if (ok <= 0) then exit;
// der nachfolgende Teil funktioniert natürlich nicht
while not rs1.eof do
begin
if VarIsNull(rs1.Fields['profil'].Value) then
profil := 'keine Angabe'
else
profil := rs1.Fields['profil'].Value;
if VarIsNull(rs1.F
Bei der Umsetzung habe ich die unten beschriebenen Probleme. Kennt jemand ein Beispiel, das zeigt, wie ich die Probleme lösen kann?
<PRE>
Vorgang:
- Ich öffne eine Access-DB mit der Funktion callDatabase und lese alle Datensätze
einzelner Tabellen mit der Funktion tryToReadDBwithDAO. Die Datensätze werden dann mit
z.B. der Funktion leseProfilwithDAO ausgewertet.
Der Programm-Benutzer soll gar nicht merken, dass die Daten aus einer DB kommen.
Er braucht auch keinerlei Datenbankspezifische visuelle Anzeige oder Auswahlmöglichkeit.
Die DB wird nur zur Datenhaltung verwendet. Ich muß die Daten mehrerer Tabellen ganz oder
teilweise auslesen, aufbereiten und dann dem Benutzer in Listen, StringGrid usw. zur Verfügung stellen.
Das funktioniert mit DAO auch ganz gut.
- Nun muß ich aber auf ADO umstellen.
Ich möchte am funktionierenden Code natürlich möglichst wenig ändern.
Die Verbindung zur Datenbank bekomme ich noch hin. Den Inhalt einer Tabelle kann
ich auch in ein DBGrid (Visible := FALSE) schreiben. Danach habe ich nur noch Probleme.
Ich weiss nicht, wie ich Daten anderer Tabellen (komplett oder selektiert) holen kann.
Fragen:
- muß ich unbedingt in ein DBGrid schreiben ?
- wie kann ich tryToReadDBwithADO eine Selektion mitgeben ?
- wie kann ich mit möglichst wenig Änderungen von DAO auf ADO umsteigen ?
-------------------------- DAO ------------------------------------------
function callDatabase(dbname: string): integer;
begin
result := 1;
try
DBEngine := CreateOleObject('DAO.DBEngine.36');
ws := DBEngine.Workspaces[0];
db := ws.OpenDatabase(dbname);
except
DBFehler;
result := 0;
end;
end;
function tryToReadDBwithDAO(sql: string; var rs: variant): integer;
begin
result := 1;
try
VarClear(rs);
rs := db.OpenRecordSet(sql,dbOpenDynaset);
rs.MoveFirst;
except
DBFehler;
result := 0;
end;
end;
procedure leseProfilwithDAO(tabname: string);
var
ok : integer;
breite : integer;
profil : string;
colname : string;
sel_str : string;
sql_str : string;
begin
sel_str := '*';
colname := 'profil';
sql_str := 'SELECT * FROM ' + tabname + ' WHERE ' + colname + ' LIKE ' + #39 + sel_str + #39;
ok := tryToReadDB(sql_str,rs1);
if (ok <= 0) then exit;
while not rs1.EOF do
begin
if VarIsNull(rs1.Fields['profil'].Value) then
profil := 'keine Angabe'
else
profil := rs1.Fields['profil'].Value;
if VarIsNull(rs1.Fields['breite'].Value) then
breite := 0
else
breite := StrToInt(rs1.Fields['breite'].Value);
Protokoll(Format('Profil=%s breite=%d',[profil,breite]));
rs1.MoveNext;
end;
end;
-------------------------- ADO ------------------------------------------
function tryToReadDBwithADO(dbname,tabname: string): integer;
begin
result := 1;
with Form1.ADOTable1 do
begin
try
Active := FALSE;
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source='
+ dbname
+ ';Mode=Read|Write|Share Deny None;Persist Security Info=False';
TableName := tabname;
Active := TRUE;
except
DBFehler;
result := 0;
exit;
end;
end;
end;
procedure leseProfilwithADO(dbname,tabname: string);
var
ok : integer;
breite : integer;
profil : string;
colname : string;
sel_str : string;
sql_str : string;
begin
sel_str := '*';
colname := 'profil';
sql_str := 'SELECT * FROM ' + tabname + ' WHERE ' + colname + ' LIKE ' + #39 + sel_str + #39;
ok := tryToReadDBwithADO(dbname,tabname);
if (ok <= 0) then exit;
// der nachfolgende Teil funktioniert natürlich nicht
while not rs1.eof do
begin
if VarIsNull(rs1.Fields['profil'].Value) then
profil := 'keine Angabe'
else
profil := rs1.Fields['profil'].Value;
if VarIsNull(rs1.F