AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Verbindung zur DB bei Programmstart
Thema durchsuchen
Ansicht
Themen-Optionen

Verbindung zur DB bei Programmstart

Ein Thema von buyden · begonnen am 21. Mär 2006 · letzter Beitrag vom 2. Apr 2006
Antwort Antwort
Benutzerbild von buyden
buyden

Registriert seit: 10. Apr 2003
Ort: Schneeberg
228 Beiträge
 
Delphi 7 Enterprise
 
#1

Verbindung zur DB bei Programmstart

  Alt 21. Mär 2006, 17:20
Hi,

Ich hab ein kleines logisches Problem:

Ich hab eine Datenbankanwendung mit ner MySQL-DB. Zu Begin werden die Verbindungsdaten (Host, User, Passwort...) aus ner config.ini ausgelesen und in die Connection eingetragen bevor diese geöffnet wird. Anschließend werden die Tabellen verbunden und diverse Abfragen ausgeführt. Das alles passiert im OnShow-Ereignis des Hauptformulars. So weit so gut.
Wenn jetzt allerdings irgend ein Eintrag in der config.ini nicht stimmt (Passwort etc.) kann das alles ja nun nicht passieren. Ich werd mit Fehlern zugebombt und das Hauptformular steht letztendlich nutzlos mit leeren dbedits und Grids da.
Ich hab das natürlich mit try except abgefangen aber das ändert nix an der Tatsache, das das Form im Fehlerfall trotzdem nutzlos liegen bleibt.

Sinnig wäre es also, wenn bei einem Fehler statt dem Hauptform ein anderes Form erscheint, in dem ich die Verbindungsdaten korrigieren kann. Problem ist aber dass das Hauptform in jedem Fall angezeigt wird, wenn ich das Verbindungsformular im Except-Bereich aufrufe.

Ich hab jetzt also das Verbindungsformular als Hauptformular eingerichtet in der Hoffnung, ich kann es im OnShow-Ereignis wenn kein Fehler auftritt ausblenden, so dass es im Normalfall nicht zu sehen ist. Geht ja aber nicht.

Wie kann ich das denn gescheit lösen, ohne dass der Nutzer nochmal irgendeinen Button klicken muss?

Ich hoffe irgendjemand kann mir folgen
Es gibt keine dummen Fragen, außer die von mir


MFG BUYDEN
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Verbindung zur DB bei Programmstart

  Alt 21. Mär 2006, 17:22
Versuchs mal im onCreate, onShow ist sowiso schlecht, da es u.U. öfters aufgerufen wird.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von buyden
buyden

Registriert seit: 10. Apr 2003
Ort: Schneeberg
228 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Verbindung zur DB bei Programmstart

  Alt 21. Mär 2006, 17:30
@mkinzler
Bei Form.create funzt die Startprozedur überhaupt nicht. Da bekomm ich ne Zugriffsverletzung.
Es gibt keine dummen Fragen, außer die von mir


MFG BUYDEN
  Mit Zitat antworten Zitat
Benutzerbild von buyden
buyden

Registriert seit: 10. Apr 2003
Ort: Schneeberg
228 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Verbindung zur DB bei Programmstart

  Alt 21. Mär 2006, 17:35
Hier mal der Code:

Delphi-Quellcode:
procedure Tfrmconnect.FormShow(Sender: TObject);
var config: tinifile;
    i:integer;
begin
  config:= tinifile.Create(extractfilepath(paramstr (0))+'config.ini');
  try
    try
      //Auslesen der Verbindungsdaten aus config.ini
      with frmdata.SQLConnect do
      begin
        HostName:= config.ReadString('DB-Server','host','');
        user:= frmmain.cipher.EncodeString('xxxxx,config.ReadString('DB-Server','user',''));
password:= frmmain.cipher.EncodeString(
'xxxxx',config.ReadString('DB-Server','passwort',''));
port:= strtoint(config.ReadString(
'DB-Server','port','0'));
//Verbinden zur DB
connect;
end;

//Öffnen der Tabellen und queries
with frmdata do
begin
tbauftrag.Open;
tbstatus.Open;
tbgeraete.Open;
tbartikel.Open;
tbstatistik.Open;
tblager.Open;
tbmessage.Open;
qutechniker.Open;

//Nachrichtenempfänger in Message ComboBox eintragen
frmsendmessage.cmbempfaenger.Items.Clear;
for i:= 1 to qutechniker.recordcount do
begin
frmsendmessage.cmbempfaenger.Items.Append(qutechniker.fieldbyname(
'kurz').asstring);
qutechniker.Next;
end;
frmsendmessage.cmbempfaenger.ItemIndex:=0;

//Erstellen der Abfrage zum Füllen des DBGrids
with quauftrag do
begin
SQL.Clear;
sql.Add(
'SELECT * FROM auftrag LEFT OUTER JOIN geraete ON auftrag.geraet = geraete.geraeteid WHERE auftrag.techniker ="'+config.ReadString('Grundeinstellungen','Technikernummer','0')+'";');
open;
//Suchen des zuletzt geöffneten Auftrages im Query
if locate(
'nummer',config.ReadString('Start','LastOpen',''),[locaseinsensitive])= true then
//Pointer setzen
tbauftrag.Locate(
'auftragid',quauftrag.fieldbyname('auftragid').AsInteger,[locaseinsensitive])
else
begin
last;
tbauftrag.Locate(
'auftragid',quauftrag.fieldbyname('auftragid').AsInteger,[locaseinsensitive]);
end;
end;

with qucountauftrag do
begin
sql.Clear;
sql.Add(
'SELECT COUNT(auftragid) FROM auftrag WHERE techniker ="'+config.ReadString('Grundeinstellungen','Technikernummer','0')+'";');
open;
frmmain.sbmain.Panels[0].Text:=inttostr(qucountauftrag.fieldbyname(
'count(auftragid)').AsInteger)+ ' Datensätze';
end;
end;
frmmain.Show;

except
showmessage(
'Fehler beim Verbinden mit der Datenbank');
edhost.SetFocus;
end;

try
edhost.Text:=config.readstring(
'DB-Server','Host','');
eduser.Text:=config.readstring(
'DB-Server','User','');
edpasswort.Text:=frmmain.cipher.EncodeString(
'xxxxxx',config.ReadString('DB-Server','passwort',''));
edport.Text:=config.readstring(
'DB-Server','Port','');
except
edhost.SetFocus;
end;


finally
config.Free;
end;
end;
Es gibt keine dummen Fragen, außer die von mir


MFG BUYDEN
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Verbindung zur DB bei Programmstart

  Alt 21. Mär 2006, 18:36
Ich gehe immer ähnlich vor. Ich verwende aber eine TDataModule.Klasse und mache alles im datModuleCreate-Event.

Delphi-Quellcode:
procedure TDaten.DataModuleCreate(Sender: TObject);
var
   ini: TIniFile;
   adress, path, dbfile, user, pass: string;
begin
    ini := TIniFile.Create('.\aktien.ini');
    try
      adress := ini.ReadString('server', 'adress', '127.0.0.1');
      path := ini.ReadString('server', 'path', '');
      dbfile := ini.ReadString('server', 'db', 'Daten.fdb');
      user := ini.ReadString('server', 'user', 'SYSDBA');
      pass := Daten.Lb3DES1.DecryptString( ini.ReadString('server', 'pass', Daten.Lb3DES1.EncryptString('masterkey')));
    finally
      ini.Free;
    end;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von buyden
buyden

Registriert seit: 10. Apr 2003
Ort: Schneeberg
228 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Verbindung zur DB bei Programmstart

  Alt 21. Mär 2006, 21:28
Gute Idee, ich verwende ja auch ein TDatamodule - da muss man erstmal drauf kommen
werd das morgen mal versuchen, heute schaff ich das nicht mehr.

Danke vorerst mal
Es gibt keine dummen Fragen, außer die von mir


MFG BUYDEN
  Mit Zitat antworten Zitat
Benutzerbild von buyden
buyden

Registriert seit: 10. Apr 2003
Ort: Schneeberg
228 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Verbindung zur DB bei Programmstart

  Alt 22. Mär 2006, 06:47
Moin,

ich hab das jetzt probiert und nur die Datenbankverbindung im OnCreate-Event des Datamodules.

Delphi-Quellcode:
procedure Tfrmdata.DataModuleCreate(Sender: TObject);
var config: tinifile;
    i: integer;
begin
  config:= tinifile.Create(extractfilepath(paramstr (0))+'config.ini');
  try
    try
    with SQLConnect do
      begin
        HostName:= config.ReadString('DB-Server','host','');
        user:= config.ReadString('DB-Server','user','');
        password:= config.ReadString('DB-Server','passwort','');
        port:= strtoint(config.ReadString('DB-Server','port','0'));
        connect;
      end;
    tbauftrag.Open;
    tbstatus.Open;
    tbgeraete.Open;
    tbartikel.Open;
    tbstatistik.Open;
    tblager.Open;
    tbmessage.Open;
    qutechniker.Open;

    except
      showmessage('Fehler beim Verbinden mit der Datenbank');
      frmconnect.showmodal;
    end;
  finally
  config.free;
  end;

end;
Dummerweise ändert das ja aber nix an der Tatsache, das das Hauptform trotzdem geöffnet wird wenn ein Fehler auftritt und ich dann schön im Rhytmus meines Timers, der ne Abfrage macht, Fehlermeldungen bekomme und die DBEdits sinnlos rumliegen.
Ich hab den Eindruck, ich muss mir noch sowas wie nen Splashscreen basteln, der dann als MainForm herhalten muss. Dann ruf ich das bisherige MainForm mit im OnCreate des Datamodules auf.
Kann man das nicht irgendwie besser lösen?
Es gibt keine dummen Fragen, außer die von mir


MFG BUYDEN
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Verbindung zur DB bei Programmstart

  Alt 22. Mär 2006, 08:24
Der Programmfluss eines Delphi-Programmes ist nunmal:
Delphi-Quellcode:
Application.Initialize;
Application.CreateForm (TMyForm, MyForm);
...
Application.Run;
Entweder Du änderst den Projektquellcode, oder Du verwendest eine andere Mainform (deine Idee). Den Projektquellcode würde ich nicht ändern (Geschmackssache). Ich verwende einen Login-Dialog als Hauptformular. Es wird also zuerst das Datenmodul und dann der Logindialog instantiiert. Anschließend wird per Application.Run der Logindialog aufgerufen. Nach Drücken des Login-Buttons wird die Verbindung aufgebaut und der User geprüft. Geht hier etwas schief, habe ich eine saubere Möglichkeit, darauf zu reagiern. Funktioniert das Login, Erzeuge ich eine Instanz des eigentlichen Hauptformulars und zeige das per Showmodal an.

Vorteil: Ich kann diesen Dialog für ALLE meine DB-Projekte verwenden und habe so eine einheitliches Look & Feel. In Deinem Fall würde ich das genauso machen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von buyden
buyden

Registriert seit: 10. Apr 2003
Ort: Schneeberg
228 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Verbindung zur DB bei Programmstart

  Alt 22. Mär 2006, 14:09
hab's jetzt mit nem splashscreen gelöst.
kann man gelten lassen denk ich.

Danke erstmal an alle.
Es gibt keine dummen Fragen, außer die von mir


MFG BUYDEN
  Mit Zitat antworten Zitat
2. Apr 2006, 20:08
Dieses Thema wurde von "Matze" von "Tutorials und Kurse" nach "Datenbanken" verschoben.
Das ist kein Tutorial.
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz