Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Kompatibilität (https://www.delphipraxis.net/37523-kompatibilitaet.html)

LkZ 6. Jan 2005 21:27


Kompatibilität
 
hi leute!

ich hab da ein progamm, dass mit einer ADOConnection und ADODataSet komponente mit einer mdb(acces-Datenbank) arbeitet..
naja ich hab bei meinem programm es so eingestellt, dass er meine ADO-DSN in die Registry schreibt/liest(natürlich sind Hauptprogramm und Datanbank-Datei im selben Ordner), damit es beim öffnen des Programms keine Probleme gibt.
Also beim starten des Programms liest er die DSN vom der Registry und beim schließen schreibt er in die Registry die DSN...

Nur das Problem ist, als ich das Programm anderen Leuten geben wollte und die das dann installiert haben, dann wollte das progamm nicht starten, alles was man dann sehen konnte ist der Splashscreen des programms und als der splashscreen dann verschwand kam nix mehr.

Doch warum gehts denn bei mir, ich hab auch oft bei mir installiert und es läuft einwandfrei.

ich hab denn mal recherchiert und hab gesehen, dass beim Registry-Eintrag beim "Wert" also da wo die DSN eigentlich stehen sollte, auf einmal nix mehr steht...sehr seltsam

kann mir jemand vielleicht helfen? ich probiers schon seit tagen aber das Resultat ist immer das selbe...

danke
MfG LkZ!

Bernhard Geyer 6. Jan 2005 21:42

Re: Kompatibilität
 
Es sind noch ein paar Fragen offen:

1, Wird in der DNS der komplette Pfad angegeben bzw. dieser dynamisch ergänzt. Falls nicht, so kann dies ein Problem darstellen, da ohne Pfadangabe immer der aktuelle Pfad zu suche genommen wird und dieser nicht immer der Anwendungspfad ist

2, Wo wird in die Registry geschrieben? Hoffentlich unter HKEY_CURRENT_USER. Unter HKEY_LOCAL_SYSTEM benötigt man Admin-Rechte für den schreibzugriff.

Falls diese Tipps nichts helfen, solltest Du noch etwas Code posten, was bei deiner Programminitialisierung passiert.

jensw_2000 6. Jan 2005 21:47

Re: Kompatibilität
 
Ein paar zusätzliche Infos wären nicht schlecht.

- schreibst den registry key mit dem connectionstring wärend des setups un die registry oder machst du das, wie ich es vermute, im onCreate deiner Mainform ?

Wenn das so ist, schau dir mal an wir ich das gemacht habe ...

//TAdoConnection.WillConnect(...);

Delphi-Quellcode:
Procedure TData.connWillConnect(Connection: TADOConnection;
  var ConnectionString, UserID, Password: WideString;
  var ConnectOptions: TConnectOption; var EventStatus: TEventStatus);

var reg:tregistry;
begin

  reg:=Tregistry.Create;
  try
    try
      reg.RootKey:=HKEY_LOCAL_MACHINE;
      reg.OpenKey('\Software\ESS\DaxoKal',true);
      if reg.ValueExists('DBDir') then DataPath:=reg.ReadString('DBDir') else Datapath:=Programmpfad;
      if reg.ValueExists('altDBDir') then altDataPath:=reg.ReadString('altDBDir') else altDatapath:=Programmpfad;
    finally
      reg.Free;
    end;
  except
  end;

  if Fileexists(Datapath+'\data.mdb') then
  begin
    if connectionstring<>DataPath+'\data.mdb' then Connectionstring:=DataPath+'\data.mdb';
    main.DBLabel.Caption:='Datenbank: '+Connectionstring;
  end
  else begin
    if Fileexists(altDatapath+'\data.mdb') then
    begin
      if connectionstring<>altDataPath+'\data.mdb' then Connectionstring:=altDataPath+'\data.mdb';
      main.DBLabel.Caption:='Datenbank: '+Connectionstring;
    end
    else begin
      Showmessage('DaxoKal konnte keine Verbindung zu der Primären und Alternativen Datenbank herstellen.'+#13#10+
                  'Bitte Überprüfen Sie Ihre Installation und die Zugriffsrechte auf die Datenbankverzeichnisse.'+#13#10+
                  'Primäre Datenbank    : '+Datapath+'\data.mdb'+#13#10+
                  'Alternative Datenbank : '+altDatapath+'\data.mdb'
                  );
      Abort;
    end;
  end;


end;
[edit=Christian Seehase]Code-Tags durch Delphi-Tags ersetzt. Mfg, Christian Seehase[/edit]

Bernhard Geyer 6. Jan 2005 21:50

Re: Kompatibilität
 
Hallo jensw,

du solltest Dein Registry-Key von HKEY_LOCAL_MACHINE nach HKEY_CURRENT_USER verschieben.
In Zeiten von Täglich zig-Neuen Viren und Würmern sollte kein (unbedarfter) User mehr mit Admin-Rechten seinen Rechner im Normalfall betreiben. Und als Nicht-Admin hast du in der Regel keinen Schreibzugriff auf HKEY_LOCAL_MACHINE.

LkZ 6. Jan 2005 21:52

Re: Kompatibilität
 
Ja Ok das mit dem HKEY_CURRENT_USER hab ich jetzt geämdert...

zu 1. das mit der DSN: er sollte eigentlich den ganzen connenctionstring in die Registry schreiben, was er ja nicht tut. Mein ConnectionString ist:

"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\Projekts\CHEMIE_datenbank\Data.mdb;Mode= ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=offbyte;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=True;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=True;Jet OLEDB:SFP=False"

naja gut weiss jetzt nicht, ob dir das hilft aber naja..

MfG

LkZ 6. Jan 2005 21:57

Re: Kompatibilität
 
Zitat:

Zitat von jensw_2000
Ein paar zusätzliche Infos wären nicht schlecht.

- schreibst den registry key mit dem connectionstring wärend des setups un die registry oder machst du das, wie ich es vermute, im onCreate deiner Mainform ?

[...]

Ich habs eine Zeit lang ma versucht mit OnCreate aber delphi hat mir immer eine exeption gegeben, bevor das programm startete, also habs ichs sein gelassen..

jensw_2000 6. Jan 2005 22:00

Re: Kompatibilität
 
@Bernhard Geyer

Du hast "für den Normalfall" Recht.

Aber in diesem Fall mache ich es gerade weil die User keine Adminrechte haben und somit die Werte nicht verändern können.

Die Datenbankverzeichnisse (DBDir - normales Datenbankverzeichnis auf dem Server, AltDBDir - ein alternatives Datenbankverzeichnis, z.B. in c:\programme\irgendwas für Notebook Nutzer) werden während der Installation, bei der man ohnehin Adminrechte benötigt, geschrieben.

Die Pfade kann man aus dem Programm heraus Ändern, wenn man lokale Adminrechte hat, normale User dürfen das halt nicht ...

:wall:
Habe gerade gesehen, dass das nicht der aktuelle Code war.

Die Änderung ist da noch nicht drin ...
Code:
reg.OpenKeyReanOnly('\Software\ESS\DaxoKal');
:hi:

LkZ 6. Jan 2005 22:11

Re: Kompatibilität
 
Ja weiss nicht...was ist denn jetzt die lösung des problems? bin jetzt total konfuss..

jensw_2000 6. Jan 2005 22:12

Re: Kompatibilität
 
@LkZ

Zitat:

"Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\Projekts\CHEMIE_datenbank\Data.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=offbyte;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=True;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=True;Jet OLEDB:SFP=False"
Damit setzt du ja voraus, das alle User dein Programm in "C:\Projekts\CHEMIE_datenbank\" installieren.

Wenn du den gesammten Connectionstring speichern willst, dann musst du im TAdoConnection.WillConnect prüfen, ob die data.mdb die im CS angegeben ist, auch wirklich im dem Pfad steht, und falls nicht, den CS ggf. abändern ...
" ExtractfilePath(application.Exename)+'\Data.mdb' "

Warum willst du das überhaupt in die Registry schreiben und dann wieder laden ? :gruebel:


gib doch einfach im TAdoConnection.Willconnect (...) folgendes ein

Connectionstring:=ExtractfilePath(application.Exen ame)+'\Data.mdb' ;
Das passt immer :cyclops:

LkZ 6. Jan 2005 22:26

Re: Kompatibilität
 
dankE! Hat echt geholfen!

Bernhard Geyer 7. Jan 2005 08:04

Re: Kompatibilität
 
Zitat:

Zitat von jensw_2000
Die Datenbankverzeichnisse (DBDir - normales Datenbankverzeichnis auf dem Server, AltDBDir - ein alternatives Datenbankverzeichnis, z.B. in c:\programme\irgendwas für Notebook Nutzer) werden während der Installation, bei der man ohnehin Adminrechte benötigt, geschrieben.

Die Pfade kann man aus dem Programm heraus Ändern, wenn man lokale Adminrechte hat, normale User dürfen das halt nicht

Ok, wenn das verhalten (Admin dürfen, Normale Anwender nicht) so auch gewünscht ist, so ist das OK.

LkZ 8. Jan 2005 19:39

Re: Kompatibilität
 
Hi ich bins nochmal!

Also 2.Problem:

Als ich mein Programm einen Freund geben wollte, dann wollte es nicht starten. Er sagte mir dass es ein "Server Error" ist. Ich habe die Fehlermeldung nicht gelesen, weil es ja bei mir funktioniert.

Dann sagte man mir, dass (viele) Personen keinen Datenbanktreiber für meine Datenbank (acces) haben, deshalb sollte ich den Treiber (woher ich ihn herbekommen sollte, weiss ich nicht) mit in die Installationsdatei beifügen.

Also meine Fragen sind:
1. Kann ich Lizenzfrei den Treiber in meine Installationsdatei beifügen?
2. Wenn ja, woher bekomm ich die (soll eine DLL sein) und wo soll sie installiert werden?

danke MfG LkZ

jensw_2000 8. Jan 2005 20:13

Re: Kompatibilität
 
Hi,


Der Treiber der verwendet wird, nennt dich OLE DB und ist bei allen WIndows Versionen (ab Win98) mit dabei.
Je nach Version der Access Datenbank (95, 97, 2000/XP, 2003) kann aber ein Update für die OLE DB Treiber
sinnvoll bzw. notwendig sein. Hier Link zu den Microsoft Data Access Components (MDAC) Version 2.8

MDAC 2.8 - Microsoft.com



Wie hast du es jetzt gemacht ?

Speicherst du den kompletten Connectionstring oder gibst du als CS die MDB Datei an ?
Ein einfache Verweis aus die MDB ist immer das Beste, da die im CS angegebenen Paramater zwischen den OLEDB Treiber Versionen und Betriebssystemen abweichen können.

:hi:


[edit]
Da fällt mir noch was ein ...

Überschreibst (bzw. setzt) du den Connectionstring im TAdoConnection.WillConnect ?
Wenn nicht, must du darauf achten, das du deine TAdoConnection vor dem Compilieren auf active:=false stellst.

Sonst passiert folgendes:
Deine Instanz von TAdoConnection wird mit dem Status active:=true und Connectionstring:="dein systemeigener cs" in die exe geschrieben. Wenn die exe jetzt auf einem anderen System gestartet wird, wo z.B. die MDB in einem anderen Verzeichnis liegt, startet dein Programm erst, nachdem das ConnectionTimeout deiner AdoConnection abgelaufen ist, und es kommen dann (ggf.) ein paar Fehler- und Folgefehlermeldungen.

Umgeben kann man das Ganze wie gesagt wenn man den CS der TAdoConnection im WillConnect Eventhandler "korrigiert und überschreibt".


[/edit]

LkZ 8. Jan 2005 20:19

Re: Kompatibilität
 
ja,ich speichere den connectionstring: ich lasse ihn in die Resigisry schreiben...

jensw_2000 8. Jan 2005 20:36

Re: Kompatibilität
 
Wenn du den kompletten ConnectionString speicherst solltest du deine AdoConnection in etwa so öffnen:


Code:
procedure AdoConnection.Willconnect(var Connectionstring...);
begin

  //.. Connectionstring aus Registry laden und
  .
  .
  .
  Connectionstring:=reg.readstring ('meinConnectionString');

end;

Code:
Procedure irgendwas;
begin
  try
     AdoConnection.open;
  except
    on e:Exception do
    begin
      if Adoconnection.connected=false then
      begin
         //  Connectionstring neu konfigurieren
      end
      else raise
    end;
  end;

   
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz