Announcement

Collapse
No announcement yet.

Access-Probleme nach Programm-Portierung

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

  • Access-Probleme nach Programm-Portierung

    Hallo Leute

    Kann mir jemand zu dem unten beschriebenen Problem --- Programm läuft auf dem einen Rechner immer, auf dem anderen nie --- ein paar Tips geben?

    Im voraus besten Dank für die Hilfe.

    günter

    <PRE>
    Vorgang:
    - Ich öffne eine Access-DB mit der Funktion callDatabase und lese die einzelnen Datensätze mit
    der Funktion tryToReadDB ohne jedes Problem mit unterschiedlichen Versionen des Programmes
    und immer wieder anderen Datenbankinhalten.
    - Ich kopiere das Programm und die Datenbank von einem NT-Rechner auf einen anderen.
    - Beide Rechner haben:
    - Windows NT 4.0 (Compilierung 1381: Service Pack 6).
    - Delphi Version 5.0 (Compilierung 5.62) 1983, 1999 Enterprise

    Probleme:
    - Das Programm verhält sich auf den beiden Rechnern sehr unterschiedlich.
    - auf dem 1. Rechner läuft es immer stabil
    - auf dem 2. Rechner bringe ich es nicht zum Laufen
    - Nach dem Kopieren der Datenbank kann ich sie nur öffnen, wenn ich in callDatabase
    DAO.DBEngine.36 in DAO.DBEngine.35 ändere.
    - db.OpenRecordSet kann einzelne Datensätze auf dem 2.Rechner nicht lesen, obwohl sie vorhanden sind.

    Fragen:
    - Läuft das Programm auf dem einen Rechner nur zufällig stabil?
    - Sind die Funktionen unsauber programmiert?

    function callDatabase(auf_str, datname: string): integer;
    begin
    try
    DBEngine := CreateOleObject('DAO.DBEngine.36');
    ws := DBEngine.Workspaces[0];
    db := ws.OpenDatabase(datname);
    except
    Ptext := Format('Datenbank %s kann nicht geöffnet werden.',[datname]);
    show_errmsg_fehler(Ptext);
    DBFehler(trcname,auf_str);
    result := 0;
    exit;
    end;
    result := 1;
    end;

    function tryToReadDB(auf_str,auf_nr: string; pos_nr: integer; tabname,sql: string; var rs: variant): integer;
    begin
    result := 1;
    try
    VarClear(rs);
    rs := db.OpenRecordSet(sql,dbOpenDynaset);
    if (VarIsEmpty(rs) = TRUE) then exit;
    if (VarIsNull(rs) = TRUE) then exit;
    rs.MoveFirst;
    except
    Ptext := '';
    if (Length(Trim(auf_nr)) <= 0) then
    Ptext := Ptext + Format('%s ist in %s nicht bekannt.',[auf_nr,tabname])
    else
    Ptext := Ptext + Format('Auftrag %s und/oder Position %d sind in %s nicht bekannt. (%s)',
    [auf_nr,pos_nr,tabname,auf_str]);
    show_errmsg_fehler(Ptext);
    DBFehler(trcname,auf_str);
    result := 0;
    end;
    end;

    </PRE>

  • #2
    - Läuft das Programm auf dem einen Rechner nur zufällig stabil?

    Wenn bei Rechner wirklich gleich sind sollten sie auch auf beiden Rechner gleich laufen. Die BS-Version und die Delphi-Version sind dabei relativ unerheblich. Das wichtigste ist bei deiner Implementierung die auf dem Rechner vorhandene Access-(Runtime-)Version. Und die ist vermutlich unterschiedlich.

    - Sind die Funktionen unsauber programmiert?

    Nicht unbedingt, jedoch nicht die beste Möglichkeit:

    DBEngine := CreateOleObject('DAO.DBEngine.36'); -> Es wird auf eine bestimmte DAO-Version verwiesen. Und diese ist vermutlich auf dem 2ten Rechner nicht vorhanden. Besser:<br>
    DBEngine := CreateOleObject('DAO.DBEngine'); -> Damit geht es mit Version 3.5 <b>und</b>3.6

    2tes Problem: Ich vermute das deine Access-Datenbank mit Access-XP (der sogar 2003) entwickelt wurde. Auf dem 2ten-Rechner aber nur Access2000 installiert ist und die Access-Engine deiner MDB-Datei nicht richtig laden kann (es wird ja so ziemlich mit jeder Access-Version das MDB-Format "erweitert"). Du hast folgende Lösungsmöglichkeiten:

    1, Du mußt dafür sorgen das auf (jedem) Zielrechner auch die Access-Engine für deine XP/2003-Datei vorhanden ist (Installation unter Admin-Konto nötig).

    2, Stelle auf jedenfall auf die ADO-Schnittstelle um (Du verwendest noch die DAO-Schnittstelle) Ist die modernere Version und ist bei D6/D7 als ADOExpress mit Komponenten dabei (Bei D5 Pro leider nur als Kostenpflichtiges Add-on). Damit sind auf jedenfall weniger Probleme zu erwarten als bei DAO

    Comment


    • #3
      Hallo Bernhard

      Vielen Dank für die rasche Antwort.

      1. Problem
      DBEngine := CreateOleObject('DAO.DBEngine'); führt dazu, dass die Datenbank auch auf dem 1. NT-Rechner nicht geöffnet werden kann. Wenn ich jedoch DAO.DBEngine.36 in DAO.DBEngine.35 ändere, kann ich die DB öffnen.

      2. Problem
      Die Access-DB wurde sicher mit einer alten Version auf einem NT-Rechner entwickelt.
      Ich kann sie ohne Problem auf ME oder XP lesen oder konvertieren. Nur auf dem 2. NT-Rechner funktioniert das nicht.

      Den Tip auf ADO umzustellen, werde ich jedenfalls beherzigen.

      nochmals vielen Dank

      günter bergaue

      Comment


      • #4
        1, Das ist neu für mich. Bei allen bisherigen COM-Objekten war die .xy-Angabe dafür zuständig 'ne bestimmte Version auszuwählen. Und ohne diese Angabe wurde die neues Version verwendet. MS hält sich halt auch nicht immer an die eigenen Vorgaben.

        2, Für DAO.DBEngine.35 muß eine dao350.dll auf dem Rechner sein. für DAO.DBEngine.36 muß eine dao360.dll auf dem Rechner sein. Kontroliere mal sowohl das vorkommen dieser Strings in der Registry als auch der Dateieien auf dem Rechner.

        ADO: Ist mit Sicherheit besser. DAO ist m.E. für die sichere Verteilung auf andere Rechner nur Murks (1000 Sachen die man beachten muß und dann läufts Aufgrund der 1001 Ausnahme doch nicht

        Comment


        • #5
          Ein kurzer Test unter XP, ME und den 2 NT-Rechnern hat gezeigt, dass mit ADO nun alle Tabellen der Datenbank lesbar sind. Das Risiko, mit der Umstellung von DAO auf ADO viel Arbeit "in den Sand zu setzen" ist daher vergleichsweise gering.

          Nochmals Dank für den Tip

          Comment

          Working...
          X