Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi CSV Dateiinahlt direkt ins TADODataSet schreiben? (https://www.delphipraxis.net/154610-csv-dateiinahlt-direkt-ins-tadodataset-schreiben.html)

Piro 17. Sep 2010 12:30

Datenbank: - • Version: - • Zugriff über: -

CSV Dateiinahlt direkt ins TADODataSet schreiben?
 
Moin,

ist es möglich, Daten aus der Textdatei z.B. CSV direkt in ein TADODataSet zu schreiben ohne das man mit einem SQL Server verbunden ist. Und kann man dann die normalen SQL Statements absetzen gegen die Daten in dem DataSet?

Vielen Dank im Voraus.

Sven

Bernhard Geyer 17. Sep 2010 12:47

AW: CSV Dateiinahlt direkt ins TADODataSet schreiben?
 
AFAIK nein. Diese In-Memory-Database hat MS erst mit .NET (ADO.NET) realisiert.

mkinzler 17. Sep 2010 12:51

AW: CSV Dateiinahlt direkt ins TADODataSet schreiben?
 
Du kannst es aber in ein CSVDataSet schreiben und dieses an ein AdoDataSet übertragen

Sir Rufo 17. Sep 2010 16:36

AW: CSV Dateiinahlt direkt ins TADODataSet schreiben?
 
Das geht auch komplett direkt mit der Möglichkeit per SQL-Befehlen drauf loszugehen.

1. Im entsprechenden Verzeichnis eine "schema.ini" anlegen
2. Die Komponente TADOConnection mit folgenden Eigenschaften:
Delphi-Quellcode:
ADOConnection1.ConnectionString := 'Driver={Microsoft Text-Treiber (*.txt; *.csv)};Extensions=asc,csv,tab,txt;';
ADOConnection1.LoginPrompt := False;
ADOConnection1.DefaultDatabase := ''; // Hier kommt der Pfad zu den CSV-Dateien rein
Mit TADOQuery oder TADOTable kannst du jetzt auf die Daten zugreifen. Hierbei sind einige grundlegende SQL-Befehle möglich.
UNION, GROUP etc.

[EDIT]Der Zugriff auf die Daten kann ausschließlich lesend erfolgen!

Piro 17. Sep 2010 20:37

AW: CSV Dateiinahlt direkt ins TADODataSet schreiben?
 
Danke für die Antworten. Die Antwort von Sir Rufo ist sehr interessant und werde ich probieren.

Schönen Abend euch noch.

Sven

Piro 18. Sep 2010 21:57

AW: CSV Dateiinahlt direkt ins TADODataSet schreiben?
 
So, ich habe das jetzt mal mit der Treiber probiert. Ich bekomme immer eine Fehlermeldung und ich kann sie nicht richtig interpretieren und den Fehler lösen. Hier mein Code:

Meine Schema.ini (im selben Verzeichnis)
Code:
[S510F_DELIVERY_PERF.TXT]
ColNameHeader = False
Format=Delimited(|)
Col1=b_nr Text
..
Delphi-Quellcode:
SQLConnection.ConnectionString := 'Driver={Microsoft Text-Treiber (*.txt; *.csv)};Extensions=asc,csv,tab,txt';
SQLConnection.LoginPrompt     := False;
SQLConnection.DefaultDatabase := ExtractFilePath(OpenTextFileDialog.FileName); // Hier kommt der Pfad zu den CSV-Dateien rein
SQLConnection.Open // --> Hier kommt die Fehlermeldung

DSData.CommandText := 'Select * From S510F_DELIVERY_PERF.TXT';
DSData.Open;
Der Fehler lautet:
Zitat:

..ist eine Exception der Klasse EOleException mit der Meldung 'Ungültiges Attribut für die Verbindungszeichenfolge' aufgetreten.
Ich habe mir dann mit einer *.udl Datei mal meine Provider angeschaut und ich kann keine Microsoft Text-Treiber finden. Ist das schon die Ursache?

Ich habe dann mal Google befragt und folgende Möglichkeit gefunden.
Delphi-Quellcode:
SQLConnection.ConnectionString :=
            'Provider=Microsoft.Jet.OLEDB.4.0;' +
            'Data Source="'+ExtractFilePath(OpenTextFileDialog.FileName)+'"; ' +
            'Extended Properties="text;HDR=NO"';
SQLConnection.Open;

DSData.LockType := ltReadOnly;
DSData.CommandType := cmdText;
DSData.CommandText := 'Select * From S510F_DELIVERY_PERF.TXT';
DSData.Open;
Diese Methode funktioniert, ist aber sehr langsam. 5 Minuten für ca. 42000 Datensätze ist zu lange. Wenn ich die Datei einfach Zeile für Zeile lese und jedesmal die Zeile nach "|" splitte, geht es in Sekunden.

Habt ihr da eventuell ne Lösung? Die Daten landen letztendlich in einem VST.

Sir Rufo 18. Sep 2010 23:55

AW: CSV Dateiinahlt direkt ins TADODataSet schreiben?
 
Die Angabe des ConnectionString ist leider nicht ganz korrekt.

Delphi-Quellcode:
'Driver={Microsoft Text-Treiber (*.txt; *.csv)};Extensions=asc,csv,tab,txt;';
Da hast du das Semikolon hinter
Code:
,txt
vergessen.

Ja, der ist da sehr zimperlich ;)

Piro 19. Sep 2010 13:41

AW: CSV Dateiinahlt direkt ins TADODataSet schreiben?
 
Ok, das Semikolon habe ich eingefügt, leider habe ich immer noch die Fehlermeldung.
Muss der Driver / Provider erst installiert werden? Wie gesagt, wenn ich mir eine *.udl Datei mache, kann ich den Provider kein Microsoft Text Treiber finden.

Woran kann es denn noch liegen? Mit dem Provider Microsoft.Jet.OLEDB.4.0 funktioniert es ja.
Hast du denn eventuell ein funktionierendes Beispiel, welches ich mal testen könnte?

Vielen Dank im Voraus.

Sir Rufo 19. Sep 2010 17:46

AW: CSV Dateiinahlt direkt ins TADODataSet schreiben?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Versuch es mal mit diesem Projekt (Source & EXE).

Interessant dabei ist:
  • Die Ausführung direkt aus der IDE schmeißt eine Exception, die aber nicht bis nach ober durchgereicht wird (einfach fortfahren wählen)
  • Wird die EXE-Datei direkt ausgeführt, erscheint auch keine Exception
  • Wird für die Connection/Query eine Komponente auf der Form benutzt, so kommt nach dem Öffnen/Schließen/Öffnen die Exception hoch
Es ist ein wenig strange, funktioniert aber ansonsten

BTW: Die "schema.ini" habe ich nicht vergessen. Dieses Beispiel funktioniert auch ohne "schema.ini"

EDIT

So, ich nehme mal alles soweit zurück :mrgreen:

Das Projekt läuft jetzt einwandfrei ohne Zicken.
Die Lösung dabei ist, dass man bei "DefaultDatabase" ein Verzeichnis eintragen muss und keinen Pfad (ich sach ja, ist zickig)

Dieses ist ein Pfad
Code:
C:\Data\
und das ein Verzeichnis
Code:
C:\Data
.

Jetzt klappt es auch mit dem Nachbarn ohne die Exception


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 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-2025 by Thomas Breitkreuz