Announcement

Collapse
No announcement yet.

Umstieg von DAO nach ADO

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Umstieg von DAO nach ADO

    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
Working...
X