Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Aus Textdatei in ADOConnection.ConnectionString (https://www.delphipraxis.net/202266-aus-textdatei-adoconnection-connectionstring.html)

Kratos 15. Okt 2019 09:27

Delphi-Version: 10.2 Tokyo

Aus Textdatei in ADOConnection.ConnectionString
 
Hi Leute,

ich bin Delphi-Neuling und nutze Delphi 10.3. Das konnte ich aber leider hier im Forum nicht auswählen.
Ich hab das Forum schon durchsucht, aber nicht ganz das Richtige für mich gefunden. Ich hoffe es ist kein Problem, dass ich ein neues Thema erstellt habe. Vielleicht hat ja einer einen passenden Link parat, sodass dieser Thread schnell wieder geschlossen werden kann.

Mein Programmaufbau:
Code:
edtLaden(TEdit), btnLaden(TButton)
btnConnect(TButton)
ADOCOnnection
ListBox1
Meine Idee:
Ich klick auf
Delphi-Quellcode:
btnLaden
.
Delphi-Quellcode:
TOpenDialog
erscheint. Ich wähle eine txt-Datei aus. Der Pfad wird in
Delphi-Quellcode:
edtLaden
geladen. In der txt-Datei ist in einer einzigen Zeile ein ConnectionString gespeichert, den ich brauche um eine Verbindung zu einer Datenbank herzustellen.
--- Bis hier hin klappt alles.
Wenn ich jetzt auf
Delphi-Quellcode:
btnConnect
klicke, soll die erste Zeile/der Inhalt der txt-Datei in
Delphi-Quellcode:
ADOConnection.ConnectionString
geschrieben werden. Das klappt aber nicht. ich bekomme folgende Fehlermeldung:

Delphi-Quellcode:
 E2010 Inkompatible Typen: 'WideString' und 'procedure, untyped pointer or untyped parameter'


Der Inhalt der Datebank soll dann in ListBox1 angezeigt werden. Wenn ich den ConnectionString manuell in
Delphi-Quellcode:
ADOConnection.ConnectionString
eintrage, klappts.
Wenn ich den ConnectionString bereits bei
Delphi-Quellcode:
FormCreate
aufrufe, klappts auch.
Jedoch will ich später mit meinen Programm, mehrere Datenbanken einlesen, ohne das Programm schließen zu müssen und ohne den ConnectionString jedes Mal neu eintragen zu müssen.
Vielleicht kann mir ja jemand weiterhelfen :)

Mein Versuch:
Code:
procedure TForm.btnConnectClick(Sender: TObject);
begin
  ADOConnection.Connected := False;
  ADOConnection.ConnectionString := ListBox1.Items.LoadFromFile(edtLaden.Text);
  ADOConnection.Connected := True;
end;
Das klappt:
Code:
procedure TForm.FormCreate(Sender: TObject);
begin
  ADOConnection.ConnectionString := 'bliblablub';
end;

Moombas 15. Okt 2019 10:20

AW: Aus Textdatei in ADOConnection.ConnectionString
 
ListBox1.Items.LoadFromFile(edtLaden.Text) ist ja auch kein String.
Du willst ja das erste Item der Listbox haben.

Code:
 ADOConnection.ConnectionString := ListBox1.Items[Zeile des ConnectionString];

p80286 15. Okt 2019 10:24

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Code:
  ADOConnection.ConnectionString := ListBox1.Items.LoadFromFile(edtLaden.Text);

  ADOConnection.ConnectionString := 'bliblablub';
Fällt Dir was auf?

Falls nicht
Delphi-Quellcode:
ADOConnection.ConnectionString := ListBox1.Items[a];
ist erfolgversprechender. (hab jetzt die genaue Syntax nicht parat, es muß auf jeden Fall ein String sein)

Gruß
K-H

Kratos 15. Okt 2019 13:12

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Dankeschön euch beiden für eure schnellen Antworten!
Das hat mich wieder ein Stück weitergebracht.


Wie würden die ersten Denkanstöße aussehen, wenn man den Zwischenschritt (Zwischenspeichern des Inhalts in der ListBox) weglassen möchte?
Meine neue Idee ist, dass der ConnectionString, der in der txt-Datei gespeichert ist, direkt aus der txt-Datei in
Delphi-Quellcode:
ADOConnection.ConnectionString
gelesen werden soll.
Ist das überhaupt möglich?

Bbommel 15. Okt 2019 13:35

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Also, eine von Delphi mitgelieferte Funktion, mit der du als "Einzeiler" den Inhalt der Datei an den ConnectionString zuweisen kannst, fällt mir zumindest auf Anhieb nicht ein. Die ganzen LoadFromFile und ähnliche sind alles Methoden, die eine Datei irgendwo in den Speicher laden und das kann man dann sauber weiterverarbeiten.

Aber es ist auf jeden Fall der absolut richtige Ansatz von dir, dass du das Laden der Datei nicht über den Umweg einer Visuellen Komponente wie der Listbox umsetzen willst! Ein möglicher und einfacher Ansatz, der dem bisherigen sehr nahe kommt, aber eben ohne diese visuelle Komponente, ist die Nutzung von TStringList:

Delphi-Quellcode:
procedure TForm.btnConnectClick(Sender: TObject);
var
  fileContent: TStringList;
begin
  fileContent:=TStringList.Create;
  fileContent.LoadFromFile(edtLaden.Text);
  ADOConnection.Connected := False;
  ADOConnection.ConnectionString := fileContent[0];
  ADOConnection.Connected := True;
  fileContent.Free;
end;
Um es sauber zu machen, sollte man das ganze noch mit try/except und/oder try/finally absichern, damit man reagieren kann, wenn beim Laden der Datei ein Problem auftritt. Aber das nur schon mal als Hinweis für den nächsten Schritt.

Kratos 15. Okt 2019 14:44

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Vielen Dank für den Tipp!

Mit StringList hab ich noch nicht gearbeitet.
Das werde ich jetzt auf jeden Fall nachholen.

VG
Kratos

Kratos 15. Okt 2019 15:02

AW: Aus Textdatei in ADOConnection.ConnectionString
 
@Bbommel

Hat super geklappt dein Code. Danke dir!

Eine Frage hab ich dazu allerdings noch:
Was bedeutet die
Delphi-Quellcode:
[0]
bei
Code:
ADOConnection.ConnectionString := fileContent[0];
?
Bedeutet das, dass die erste Zeile, der in der Variablen
Delphi-Quellcode:
fileContent
gespeicherten Datei, dem
Delphi-Quellcode:
ConnectionString
zugewiesen wird, oder hat das eine andere Bedeutung?

Bbommel 15. Okt 2019 15:14

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Genau, so bekommst du den ersten Eintrag der Liste der Strings, die in der StringList "fileContent" gespeichert sind. Und das wiederum ist die erste Zeile deiner Datei.

Ausführlicher könnte man auch schreiben:
Delphi-Quellcode:
ADOConnection.ConnectionString := fileContent.Strings[0];

Aber weil "Strings" die Standardeigenschaft einer TStringList ist, kann man das auch weglassen.

Siehe hier: http://docwiki.embarcadero.com/Libra...trings.Strings

Ich hoffe, da waren noch ein paar hilfreiche Stichworte dabei, damit du dich weiter einlesen kannst. :-)

Kratos 15. Okt 2019 15:29

AW: Aus Textdatei in ADOConnection.ConnectionString
 
@Bbommel
Alles klar, danke dir.
Zitat:

Ich hoffe, da waren noch ein paar hilfreiche Stichworte dabei, damit du dich weiter einlesen kannst.
Ja, auf jeden Fall.

Ich finde es gerade irgendwie super geil, wie hier der Austausch funktioniert! :)

Nochmal danke @alle.

VG
Kratos

haentschman 16. Okt 2019 07:31

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Moin...8-)
Unasbhängig von der Aufgabe...ich würde dir statt einer "normalen" Textdatei eine INI Datei empfehlen. Ist zwar auch nur eine Textdatei aber mit Struktur.
https://www.delphi-treff.de/tipps-tr...n/ini-dateien/
:wink:

Moombas 16. Okt 2019 11:10

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Möp, da tippelt man eine Antwort, vergisst sie abzusenden und dann kommt einem haentschman zuvor ;)

Ich würde dir ebenfalls zu einer INI raten, zumal du dann nicht an eine Reihenfolge gebunden bist, sondern deine Strings sauber direkt ansprechen kannst.
Goodie wäre auch, das du auch andere Einstellungen dort speichern/ändern könntest, die ggf. der Benutzer selber machen kann etc.

Kratos 16. Okt 2019 13:39

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Danke euch beiden (@haentschman, @Moombas)!

Ich werde euren Rat in Zukunft beherzigen. :)

HolgerX 16. Okt 2019 15:36

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Hmm..

Oder Du verwendest Text-Dateien im UDL-Format (Ist auch nur eine Text-Datei).
Hierüber kannst Du den Connection-String in eben dieser UDL-Datei ablegen und dann nur den Dateinamen (mit Pfad) als Connection-String angeben.

Dann wird diese Datei von der ADOConnection selber geladen...

Kratos 8. Nov 2019 07:48

AW: Aus Textdatei in ADOConnection.ConnectionString
 
@haentschman

Vielen Dank für den Tipp! :)
Ja, inzwischen bin ich dazu übergegangen .ini zu verwenden.

jobo 8. Nov 2019 08:16

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Wieso nutzt man nicht die Formate, die vorgesehen sind?
Der Vorschlag von HolgerX passt doch genau. Mit einer UDL Datei kann gleich per Doppelklick den Verbindungsdialogeditor nutzen und sogar den Verbindungstest durchführen.
Dazu braucht man initial sogar keinen Deut Wissen über das Format. Es reicht eine leere Datei mit der Endung ".udl"

p80286 8. Nov 2019 09:25

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Wenn man mehrere Datenbanken im Auge hat, ist die .Ini-Datei m.M. nach vorteilhaft, weil da hat man auf einen Griff/Blick alles zusammen. UDL-Dateien muß ich mir erst zusammen suchen. Aber das ist auch der einzige Nachteil. Für den initialen Aufbau oder Tests natürlich .UDL.

Gruß
K-H

Moombas 8. Nov 2019 09:43

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Wobei eine Kombination aus beidem (ini und udl) ja auch möglich wäre. Man gibt in der Ini-Datei an welche *.UDL für welchen Zugriff verwendet werden soll.

freimatz 12. Nov 2019 15:27

AW: Aus Textdatei in ADOConnection.ConnectionString
 
Zitat:

Zitat von Bbommel (Beitrag 1449675)
Also, eine von Delphi mitgelieferte Funktion, mit der du als "Einzeiler" den Inhalt der Datei an den ConnectionString zuweisen kannst, fällt mir zumindest auf Anhieb nicht ein.

Seit einiger Zeit gibt es in unit System.IOUtils die Methode TFile.ReadAllText(). Das nimmt aber die ganze Datei und nicht nur die erste Zeile.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 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