Autor Beitrag
glants Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 19.08.09 21:54 
Danke für den Hinweis mit der "executeNonQuery()" - manchmal sieht man vor lauter Wald die Bäume nicht mehr... Trotzdem, wie hast du das gemacht ? Ich versuche nun schon wieder seit 2 Stunden Testhalber nur 2 Spalten aus der Datei nach Access zu speichern und bekomme den Fehler "Syntaxfehler in der INSERT INTO-Anweisung." - in der Zeile "cmdDB.ExecuteNonQuery();" ! Ich habe dazu auch eine Excel.mdb mit nur den 2 Spalten erstellt. Was mach ich bloß falsch ?
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
            StringBuilder insSql = new StringBuilder();
            insSql = insSql.Append("INSERT INTO tblTelekom (Anschluss, Ziel ");
            insSql = insSql.Append("SELECT T.Anschluss, T.Ziel FROM ");
            insSql = insSql.Append("[Text;;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE=C:\\Daten\\C#\\C#_Projekt\\].19082009212851.txt ");
            insSql = insSql.Append("AS T WHERE T.Anschluss Not In(SELECT Anschluss FROM tblTelekom) ");

            MessageBox.Show(insSql.ToString());

            string connectionstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Daten\\C#\\C#_Projekt\\Excel.mdb;User Id=admin;Password=;";
            OleDbConnection connDB = new OleDbConnection(connectionstring);
            OleDbCommand cmdDB = new OleDbCommand(insSql.ToString(), connDB);
            connDB.Open();
            cmdDB.ExecuteNonQuery();

            cmdDB = null;
            connDB.Close();
            connDB = null;


Wäre es möglich deinen funktionierenden Code zu posten ?

mfg
Glants
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Do 20.08.09 07:33 
Angefangen habe ich mit einer Tabellenerstellungsabfrage in Access:

ausblenden Quelltext
1:
SELECT T.* INTO Test FROM [Text;;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE=C:\0\].0.txt As T;					


Dann habe ich die Daten in Access wieder gelöscht und mit einer WinApp wieder angefügt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
string s = "INSERT INTO Test (Anschluss, Rufnummer, Ziel, Datum, Verbindungszeit, Anfang, Dauer, TE, Tarif, Betrag, Waehrung) ";
s += "SELECT Anschluss, Rufnummer, Ziel, Datum, Verbindungszeit, Anfang, Dauer, TE, Tarif, Betrag, Waehrung ";
s += "FROM [Text;;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE=C:\\0\\].0.txt AS T";

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\0\\Test.mdb;User Id=admin;Password=;");
OleDbCommand cmd = new OleDbCommand(s, con);
con.Open();
cmd.ExecuteNonQuery();
cmd = null;
con.Close();
con = null;


ID und Zone machen noch Probleme, allerdings habe ich noch keine Lösung dazu gefunden. Ok, mit [] für die Feldnamen klappt es. Bei der ID kann ich das noch wegen den Sonderzeichen verstehen, bei der Zone bin ich überfragt, das ist normalerweise kein reserviertes Wort :(

ausblenden C#-Quelltext
1:
2:
3:
string s = "INSERT INTO Test ([´╗┐ID], Anschluss, Rufnummer, Ziel, [Zone], Datum, Verbindungszeit, Anfang, Dauer, TE, Tarif, Betrag, Waehrung) ";
s += "SELECT [´╗┐ID], Anschluss, Rufnummer, Ziel, [Zone], Datum, Verbindungszeit, Anfang, Dauer, TE, Tarif, Betrag, Waehrung ";
s += "FROM [Text;;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE=C:\\0\\].0.txt AS T";

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 20.08.09 08:42 
Wenn das der Original-Code ist, dann fehlt hier eine abschließende Klammer hinter dem letzten Feldnamen:
ausblenden C#-Quelltext
1:
2:
3:
4:
// falsch:
            insSql = insSql.Append("INSERT INTO tblTelekom (Anschluss, Ziel ");
// richtig:
            insSql = insSql.Append("INSERT INTO tblTelekom (Anschluss, Ziel) ");

Übrigens: Setze die DbConnection in einen using-Block (und der DbCommand bleibt innerhalb dieses Blocks); dann kannst du auf conn.Close und das doppelte Setzen auf null verzichten.

Gruß Jürgen
glants Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 20.08.09 22:57 
S.g. Jürgen, s.g. Jan !

JUCHU !! Es hat alles geklappt, die Datei ist genauso wie ich sie weiter benötige im Access (~8000 Datensätze, habe jetzt keine ID, ist aber egal). Ich bedanke mich recht herzlich für eure Hinweise und die Ausdauer. Eine Frage habe ich noch: Wenn ich nun eine zweite Datei aufrufe (wieder an die 9000 Datensätze) passiert erst gar nichts, ich dachte zuerst das Programm ist abgestürzt, es wurden jedoch Datensätze (einige wenige) dem Access hinzugefügt. Wie kann ich auch weitere Text-Files dem ersten als ganzes hinzufügen ? Ich verspreche, dass das in dem Zusammenhang das letzte ist, was ich wissen möchte.

mfg
Glants
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Fr 21.08.09 07:24 
Selbst wenns nicht das letzte ist, müsstest du mit Antworten rechnen ;) Sollen die DS jetzt der 1. Textdatei angefügt werden oder in die Tabelle? Wie sieht es mit doppelten DS aus?

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
glants Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Fr 21.08.09 13:42 
Die Textdatei (einmal pro Monat) soll im Prinzip 1:1 in das Access übermittelt werden. Jedes Monat soll diese Datei ohne Prüfung einfach angefügt werden. Datensätze können eigentlich nicht doppelt vorkommen - naja, wenn sie 2 mal importiert wird schon, muss der "Bediener" auch etwas aufpassen !

mfg
Glants
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Fr 21.08.09 14:08 
Eigentlich sollte der Code das schaffen, kannst du beim 2. Import vorher mal schauen, ob mit der Abfrage in Access die Datei geöffnet werden kann?

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
glants Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 23.08.09 11:22 
Irgendwas tut sich in der Datenbank, wenn ich die 2. Datei aufrufe sehe ich dass dass auf die DB zugegriffen wird. Hatte die Erste probehalber auf 88 Datensätze "gekürzt und die 2. auf 46. Hatte daraufhin 90 Datensätze. Habe nun versucht beide Male mit 5 Datensätzen zu arbeiten und im Access auch nur 5 vorgefunden. Bin mir nicht sicher, ob ich verstehe, wie der SQL-INSERT-Befehl arbeitet. Ich erlaube mir die beiden gekürzten Dateien anzuhängen. Werde aber weiter versuchen das "Geheimnis" zu enträtseln. Für Hilfe war, bin und werde ich dankbar sein !

mfg
Glants


Zur Vollständigkeit nochmals der SQL Befehl:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
insSql = insSql.Append("INSERT INTO tblTelekom (Anschluss, Rufnummer, Ziel, [Zone], ");
insSql = insSql.Append("Datum, Verbindungszeit, Anfang, Dauer, TE, Tarif, Betrag, Waehrung) ");
insSql = insSql.Append("SELECT T.Anschluss, T.Rufnummer, T.Ziel, T.[Zone], T.Datum, T.Verbindungszeit, ");
insSql = insSql.Append("T.Anfang, T.Dauer, T.TE, T.Tarif, T.Betrag, T.Waehrung FROM ");
insSql = insSql.Append("[Text;;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE=" + pathName + "]." + fileName + " ");
insSql = insSql.Append("AS T WHERE T.Anschluss Not In(SELECT Anschluss FROM tblTelekom) ");
Einloggen, um Attachments anzusehen!
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: So 23.08.09 13:27 
user profile iconglants hat folgendes geschrieben Zum zitierten Posting springen:
Bin mir nicht sicher, ob ich verstehe, wie der SQL-INSERT-Befehl arbeitet.
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
INSERT INTO tblTelekom 
    (Anschluss, Rufnummer, Ziel, [Zone], 
     Datum, Verbindungszeit, Anfang, Dauer, TE, Tarif, Betrag, Waehrung) 
SELECT T.Anschluss, T.Rufnummer, T.Ziel, T.[Zone], T.Datum, T.Verbindungszeit, 
     T.Anfang, T.Dauer, T.TE, T.Tarif, T.Betrag, T.Waehrung 
  FROM [Text;;FMT=Delimited;HDR=yes;IMEX=2;CharacterSet=850;DATABASE=...]... AS T 
 WHERE T.Anschluss NOT IN (SELECT Anschluss FROM tblTelekom);

Ich habe mal wegen der besseren Lesbarkeit als SQL formatiert.

Es handelt sich hier um die Variante des INSERT-Befehls, die Daten aus einem SELECT-Befehl übernimmt:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
INSERT INTO <Tabellenname>
     ( <Spaltenliste als Ziel> )
SELECT <Spaltenliste als Quelle>
  FROM <Tabellenname> AS <Alias>
 WHERE <Suchbedingung>;

Die beiden Spaltenlisten müssen von Anzahl und Typ übereinstimmen (genauer: kompatibel sein). Das sollte bei dir gegeben sein; allenfalls gibt es Probleme mit der Formatierung von Datum, Uhrzeit, Betrag, was aber hoffentlich durch die Bezeichnungen in der FROM-Klausel geregelt wird. (Wenn es nicht übereinstimmt, solltest du eine OledbException bekommen.)

Der Tabellen-Alias "T" ist nicht erforderlich, weil es sich sowieso nur um eine (Quell-) Tabelle handelt. Er steht vermutlich nur deshalb, um die Spalten von Quelle und Ziel zu unterscheiden.

Die Auswahlbedingung sagt (das ist das Schöne an SQL, es ist fast verständliche Sprache): Wähle ... aus, SOFERN (der Anschluss) NICHT ENTHALTEN IST IN (Liste aller schon vorhandenen Anschlüsse in der Zieltabelle). Mit deinen Beispieldateien bedeutet das: Keiner der neuen Datensätze darf übernommen werden, weil der Anschluss bereits gespeichert ist.

Ich habe jetzt die ursprüngliche Fragestellung nicht nochmals gelesen; ich glaube aber nicht, dass du diese Auswahlbedingung wirklich haben willst.

Gruß Jürgen

PS. Ich schreibe zz. an einer Einführung in SQL; diese hat aber noch Lücken.
glants Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 23.08.09 15:19 
Danke für die Erklärung, die SQL Einführung werde ich mir noch genauer ansehen. Nach einigem probieren und weil es mir nicht klar war, habe ich die "Where" - Klausel selbst einfach weggelassen. Jetzt funktioniert es so, wie ich es mir vorgestellt habe - die Dateien sind im Access. :D
Ich möchte mich für eure Hilfe und Unterstützung bedanken, kann jedoch (wie bereits weiter oben beschrieben), nicht versprechen, nicht noch die eine oder andere Frage zu stellen !!

mfg
Glants