AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Adoconnection liest keinen String
Thema durchsuchen
Ansicht
Themen-Optionen

Adoconnection liest keinen String

Ein Thema von Privateer3000 · begonnen am 21. Mär 2012 · letzter Beitrag vom 24. Mär 2012
Antwort Antwort
Seite 2 von 2     12   
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#11

AW: Adoconnection liest keinen String

  Alt 21. Mär 2012, 19:20
...aber ich habe durchaus Tabellen in TAdoDataSet zur Entwicklungszeit aktiv und kann trotzdem den ConnectionString zur Laufzeit umbauen.
Ich nehme an, dass die Nichtbeachtung deiner Regeln bei Anwendungen zu Problemen führt, die alle Fenster bereits beim Programmstart erzeugen?
Das ist soweit richtig.
Nur ist es bei vorallem bei grossen Projekten so, dass man die Reihenfolge in der Datenmodule und Formulare erzeugt werden nicht 100% im Griff hat.
Lange Zeit läuft alles gut, aber vielleicht benötigt ein Formular dass frühzeitig erzeugt wird, ein weiteres Datenmodul.
Auf diesem Datenmodul sitzt dann vielleicht dummerweise ein aktives ADODataset und schon hat man ein Problem.

Noch gemeiner ist folgende Konstellation:
In der IDE ist das Datenmodul auf dem die ADOConnection liegt geöffnet. (Connected=False)
Jetzt braucht man nur versehentlich das Formular/Datenmodul mit dem aktiven ADODataset öffnen
um etwas nachzuschauen und die Connection wird automatisch aktiv. *)
Wenn man jetzt nicht aufpasst und in der IDE "Alles speichern" wählt wird die ADOConnection mit Connected=True abgespeichert.
Aber man bemerkt das Problem nicht; erst auf dem Zielrechner beim Endbenutzer gibt es Ärger.

*) die IDE müsste eine "Schatten"-ADOConnection, also eine Kopie der orginalen Connection benützen, dann wäre das Problem vom Tisch.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Adoconnection liest keinen String

  Alt 21. Mär 2012, 19:22
Vielen Dank für Eure Antworten.

Diese " 5 Gebote" sind mir eigentlich bekannt.
Habe aber trotzdem keine aktive Komponente gefunden.
Interessant ist aber noch folgendes
im OnClose Ereignis der Anwendung schreibe ich die
DSN in die Registry, übernommen aus dem connectionstring der Ado.
Diese ist aber die korrekte.
Es ist aben nur beim Anwendungsstart, dass die "alte" versucht wird aufzubauen.
Ist aber der String leer kommt der Authentifizierungsfehler.
Es ist echt zum Mäuse melken...
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#13

AW: Adoconnection liest keinen String

  Alt 21. Mär 2012, 19:49
Hast du schon einmal mit UDL-Dateien gearbeitet?
In einer UDL-Datei wird der gesamte ConnectionString gespeichert und kann vom Benutzer leicht (per Doppelklick!) geändert werden.
Dein Programm braucht sich darum überhaupt nicht zu kümmern.
Im Anhang ist eine UDL-Datei zum Testen.

Hier ein Beispiel wie du die Connection herstellen kannst:
Delphi-Quellcode:
  if ADOConnection1.Connected then
    // Prüfung, ob ADOConnection schon aktiv ist
    ShowMessage('Warnung: ADOConnection ist schon aktiv !');
  // ConnectionString aus UDL-Datei zuweisen
  // UDL-Datei heisst genau gleich wie deine EXE; hat aber nur die Endung .udl
  ADOConnectionSetupUDL(ADOConnection1, '');
  ADOConnection1.Connected := True;
Und hier noch die Hilfsfunktionen:

Delphi-Quellcode:
uses ...,ADODB;


resourcestring
  SUDLMissing = 'UDL-Datei "%s" nicht vorhanden !';

// liefert Dateiname inkl. Pfad der Anwendung oder der DLL
function GetModuleName: string;
var
   hi : HINST;
begin
   SetLength(Result, MAX_PATH);
   if IsLibrary then
      hi := HInstance
   else
      hi := 0;
   SetLength(Result, GetModuleFileName(hi, PChar(Result), length(Result)));
end;


procedure ADOConnectionSetupUDL(cn: TADOConnection; const UdlFile: string);
var
   FileName: string;
begin
   cn.Connected := False;

   FileName := UdlFile;

   if FileName='then
      FileName := ChangeFileExt(GetModuleName, '.udl')
   else if ExtractFilePath(FileName) = 'then
      // Wenn kein Pfad übergeben wurde => Pfad der Exe eintragen
      FileName := ExtractFilePath(GetModuleName) + FileName;

   if not FileExists(FileName) then
      raise EADOError.CreateFmt('ADOConnectionSetupUDL(%s,%s) '#13#10+
         SUDLMissing, [cn.Name,UdlFile, filename]);

   cn.ConnectionString := 'FILE NAME=' + FileName;
end;
Angehängte Dateien
Dateityp: zip Test.zip (345 Bytes, 4x aufgerufen)
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#14

AW: Adoconnection liest keinen String

  Alt 21. Mär 2012, 20:12
@shmia
Die immer wieder auftretende Problematik mit geöffneten Datasets zu Entwicklungszeit lassen sich durch eine Flagüberprüfung in BeforeConnect in den Griff bekommen, wenn das Flag nicht gesetzt (gesetzt wir nach dem Lesen des ConnectionsStrings aus der INI/Registry/Konfiguration) ist wird ein Abort abgesetzt.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Adoconnection liest keinen String

  Alt 21. Mär 2012, 21:49
Das seltsame daran ist doch eigentlich
dass ich die prinzipielle Vorgehensweise schon
mehrmals eingesetzt habe.
Nur diesmal geht irgendwas schief...
Vllt. wäre es besser wenn mal jemand einen Blick darauf werfen
könnte.
Kann ja sein dass ich irgendwas übersehen habe.

Grüße
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Adoconnection liest keinen String

  Alt 21. Mär 2012, 22:41
@shmia
Die immer wieder auftretende Problematik mit geöffneten Datasets zu Entwicklungszeit lassen sich durch eine Flagüberprüfung in BeforeConnect in den Griff bekommen, wenn das Flag nicht gesetzt (gesetzt wir nach dem Lesen des ConnectionsStrings aus der INI/Registry/Konfiguration) ist wird ein Abort abgesetzt.
Das mit dem BeforeConnect ist eine gute Stelle ... aber warum ein Abort?
Ich setze in dem Event einfach den gewünschten ConnectionString
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#17

AW: Adoconnection liest keinen String

  Alt 21. Mär 2012, 22:57
@Sir Rufo

Machen wir in vielen Anwendungen auch so, es gibt aber einige bei denen durch die Erstellungsfolge ein anderes Vorgehen erwünscht ist, daher haben die Templates/Frameworks an diesen Stellen o.g. Code drin, der dann gegf. ersetzt wird, quasi als Sicherung.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Adoconnection liest keinen String

  Alt 24. Mär 2012, 09:19
[QUOTE=shmia;1157838]Hast du schon einmal mit UDL-Dateien gearbeitet?
In einer UDL-Datei wird der gesamte ConnectionString gespeichert und kann vom Benutzer leicht (per Doppelklick!) geändert werden.
Dein Programm braucht sich darum überhaupt nicht zu kümmern.
Im Anhang ist eine UDL-Datei zum Testen.

Vielen Dank für Deine Anregung,
ich habe alle Schritte nochmal verfolgt.
Das setzen des Strings verläuft ohne Problem
erst beim ersten query knallts.
Jetzt habe ich keine Idee mehr, es ist wie verhext.
....
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#19

AW: Adoconnection liest keinen String

  Alt 24. Mär 2012, 09:57
Bei ADO Komponenten muss man folgende Regeln beachten!
1.) es darf nur eine einzige ADOConnection pro Datenbank geben
...
Das ist bei nie ein Problem gewesen. Aber deine weiteren Ausführungen sind entscheidend!
Ich erschlage sie mit GExperts: Dort kann man einstellen, das Delphi vor dem Compilieren dafür sorgt, das alle Connections und Datasets geschlossen sind (Set Component Properties).

Warum man nur eine Connection haben sollte, würde mich mal interessieren.

Zum Problem: Abfragen auf true/false = unnötig und gefährlich. (mehr unnötig als gefährlich)
Das löst aber nicht das Problem, sieht aber hübscher aus.
Delphi-Quellcode:
if ReadDSNFromRegistry(DSN) then begin
 if DataModule1.SetMinervaDSN(DSN) then
Der folgende Code aus Post #1 soll dein 'SetMinervaDSN' sein? So ist es moderner:
Delphi-Quellcode:
Result := true;
if Datenbank.Connected then
  if not CloseDatabase then begin
    Result := false;
    Exit;
  end;
Datenbank.ConnectionString := DSN;
Ich hatte solange die gleichen Probleme wie Du, bis ich die 5 Regeln (na ja, 2-5) strikt durch Verwendung der GExperts eingehalten habe.

Bin ich auf einem fremden Delphi ohne GExperts, knallt mir das jedesmal um die Ohren.

Das seltsame daran ist doch eigentlich dass ich die prinzipielle Vorgehensweise schon
mehrmals eingesetzt habe. Nur diesmal geht irgendwas schief...
Das klingt genauso wie wenn meine Programmierer vor der rauchenden Maschine stehen und sagen: "Ich hab eigentlich nix gemacht!"

Das Schöne an unserem Beruf ist doch: So eine SW ist deterministisch. Wenn's gestern lief und heute nicht, ist nicht das Wetter oder die Stimmung Schuld, sondern das gottverdammte System.

Du wirst zur Designzeit irgendwo rumgeklickelt haben, oder Delphi von mir aus von ganz alleine oder ein Kobold.

Sorge stringent dafür, das beim Start des Programms alle Verbindungen und Datasets tot sind (Lade GExperts oder verwende Bummis Trick, wobei der 'nur' meckert, was aber auch ok ist)

Noch ein Trick (auch bei Datasnap oder TCP): Suche per Explorer (Totalcommander, egal) in den (Text-)DFM-Dateien nach "Connected=True" oder "Active=True" usw. Wenn ich eine Stelle gefunden habe, war ich mir jedesmal sicher, das ich das unter Delphi geprüft hatte.

Merke: Je komplexer die IDE, desto mehr unsichtbare Kobolde frickeln an deinem Code rum
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#20

AW: Adoconnection liest keinen String

  Alt 24. Mär 2012, 10:11
Manchmal stellt man sich auch selbst ein Bein, wenn Du einen ConnectionString in folgender Art aufbaust
Code:
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=test;Data Source=BUMMI-MOBI
und LoginPrompt auf false setzt bekommt man den beschrieben Fehler auch, in dem Fall das Speichern des Kennwortes zulassen oder LoginPromt auf True setzen oder den String über ein eigenes Loginfenster ergänzen lassen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

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 12:36 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