Zum Inhalt springen

Datenbank in txt.Datei exportieren


Empfohlene Beiträge

Geschrieben

Hi,

ich hab da ne Frage, und zwar wollte ich bzw. will ich Datensätze meiner SQL Datenbank in VS 2010 exportieren in eine txt.Datei - nach bestimmten Vorgaben ( ich meine damit : alle Zeilen in der txt.Datei müssen den selben Abstand haben, weil beim Importieren ich von Zeilen ausgehe -> also ab Stelle 0-20 ist die Bezeichnung -> ab 20-22 ist das Kürzel usw. ) und genau das will ich programmieren.

Ich habs schon soweit das ich mit dem StreamWriter eine txt.Datei erstelle und dort die Bezeichnung + Kürzel reinschreiben kann. Nur das mit den Abständen kriege ich nicht hin. Denn wenn ich das so mache :

zeile = gruppe.BEZEICHNUNG+ "       " + gruppe.KUERZEL;

Dann ist das ungenau, denn die Bezeichnungen sind verschieden lang, so kann ein Kürzel von der Stelle 20 beginnen oder auch 25 usw.

Beispiel:

PC und Zubehör AA

Schrank AG

Geschrieben

Hey super! Danke ;)

Ich habe noch eine Frage, ich holle mir jetzt die Datensätze über eine Linq Anweisung ( IQueryable ) .... dann schreibe ich sowas wie :

foreach (DtoGruppe gruppe in qGruppe)

{

 zeile = string.Format("{0,-3}{1,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG);

}
Doch ich habe auch zu einzelnen Gruppen, sogenannte Gruppenfelder. Letzendlich sollte es so aussehen:
AAPC und Zubehör AAAMonitor AAPC und Zubehör AABFestplatte AAPC und Zubehör AACHauptspeicher AAPC und Zubehör AADLaufwerk 1 AAPC und Zubehör AAELaufwerk 2
Vorne sind Kürzel + Bezeichnung <- habe ich jetzt auch genau so ;) Danke sehr nochmal .... und jetzt fehlen halt die Gruppenfelder. Abstand kriege ich hin, aber wie holle ich sie mir aus der DB ? Wenn ich in die foreach der Gruppe noch eine foreach der Gruppenfelder einbaue, sieht es erstmal so aus :
       foreach (DtoGruppe gruppe in abfrageGruppe)

            {

               foreach (DtoGruppenFeld gruppenFeld in abfrageGruppenfeld)

               {

                  // befüllen der txt.Datei

                  //zeile = String.Format("bezeichnung = {0}, kuerzel = {1:hh}", gruppe.BEZEICHNUNG + gruppe.KUERZEL);

                  zeile = string.Format("{0,-3}{1,-70}{2,-3}{4,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG );


                  writer.WriteLine(zeile);

               }

            }

Und ich bekomme diese Fehlermeldung :

Der Index, basierend auf 0 (null), muss größer als oder gleich Null sein, und kleiner als die Größe der Argumentenliste.
Geschrieben

Okey, mein Fehler.

 zeile = string.Format("{0,-2}{1,-70}{2,-2}{4,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG );

Hätte anstatt der 4, eine 3 hinschreiben sollen - jetzt funktionierts jedenfalls fast ^^

Jetzt wird die Textdatei sehr sehr lang, sollte eig. so aussehen :

AAPC und Zubehör AAAMonitor

AAPC und Zubehör AABFestplatte

AAPC und Zubehör AACHauptspeicher

AAPC und Zubehör AADLaufwerk 1

AAPC und Zubehör AAELaufwerk 2

AAPC und Zubehör AAFSchnittstelle 1

AAPC und Zubehör AAGSchnittstelle 2

AAPC und Zubehör AAHDruckerfabrikat

ABStuhl ABAArt des Stuhl

ABStuhl ABBMaterial

ABStuhl ABCFarbe

ABStuhl ABDArmlehne (J/N)

Bei mir siehts so aus :

AAPC und Zubehör AAAMonitor

AAPC und Zubehör AABFestplatte

AAPC und Zubehör AACHauptspeicher

AAPC und Zubehör AGDSchließmechanismus

AAPC und Zubehör AADLaufwerk 1

AAPC und Zubehör AAELaufwerk 2

AAPC und Zubehör AAFSchnittstelle 1

AAPC und Zubehör AAGSchnittstelle 2

AAPC und Zubehör AAHDruckerfabrikat

AAPC und Zubehör ABAArt des Stuhl

AAPC und Zubehör ABBMaterial

AAPC und Zubehör ABCFarbe

AAPC und Zubehör ABDArmlehne (J/N)

Also, irgendwie muss ich das so hinbekommen, dass nur die Gruppenfelder der einzelnen Gruppe hinzugefügt werden, irgendwie nach dem Kürzel prüfen o.ä ?

Weil die Gruppenfelder beginnen ja alle mit AA oder AB je nach der Gruppe wo sie dazugehörren ...

Geschrieben

Hey super ;) Bin noch ein Anfänger, von daher sorry ^^ Aber du hilfst mir wirklich wunderbar ...

Jetzt habe ich folgenden Code der auch so super funktioniert :

            foreach (DtoGruppe gruppe in abfrageGruppe)

            {

                IQueryable<DtoGruppenFeld> abfrageGruppenfeld = from gruppenFeld in dmc.DbGruppenFelder

                                                         where gruppenFeld.KUERZEL.Substring(0,2) == gruppe.KUERZEL

                                                         select gruppenFeld;


               foreach (DtoGruppenFeld gruppenFeld in abfrageGruppenfeld)

               {

                  // befüllen der txt.Datei

                  zeile = string.Format("{0,-2}{1,-70}{2,-2}{3,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG );


                  writer.WriteLine(zeile);

               }

            }

Wenn da aber nicht doch ein "kleiner" Fehler wäre -> mit dem Code fallen leider die paar ( sind sehr wenige ) Gruppen weg die eben KEIN Gruppenfeld haben. Nur habe ich bisher nie eine if Bedingung o.ä in eine foreach geschrieben ... bin grad am überlegen wie ich das noch dazubauen kann.

Geschrieben
mit dem Code fallen leider die paar ( sind sehr wenige ) Gruppen weg die eben KEIN Gruppenfeld haben.
Welcher Text soll für diese Gruppen denn in der Datei stehen? Sollen die Spalten für die Gruppenfelder einfach leer bleiben?

Du kannst das übrigens auch mit einer einzigen Abfrage machen. Stichwort JOIN.

Geschrieben

Jap es bleibt dann einfach leer.

Beispiel:

AJRecorder/Videogeräte

AKRollos/Verschattungen

ALSchulbedarf

Und bei mir fallen jetzt z.B.AJRecorder und AKRollos weg.

Join sagt mir garnix, ehrlich gesagt.

Geschrieben
Join sagt mir garnix, ehrlich gesagt.
Joins sind ein elementarer Bestandteil von SQL. Damit kannst du Abfragen über mehrere Tabellen machen. Dein Problem mit den Gruppen ohne Gruppenfelder ließe sich damit auch ganz einfach lösen.

Zeig doch mal, wie deine beiden Abfragen jetzt aussehen.

Geschrieben

Jop, habe bisher nie Join Abfragen gelernt bzw. gebraucht.

Momentan siehts so aus :

      StreamWriter writer;

         string zeile;


         // Datensätze aus DB hollen

         DatenContainer dmc = new DatenContainer();

         IQueryable<DtoGruppe> abfrageGruppe = from gruppen in dmc.DbGruppen

                                               select gruppen;

         // erstellen der txt.Datei

         writer = File.CreateText(pfad);


            foreach (DtoGruppe gruppe in abfrageGruppe)

            {

                IQueryable<DtoGruppenFeld> abfrageGruppenfeld = from gruppenFeld in dmc.DbGruppenFelder

                                                         where gruppenFeld.KUERZEL.Substring(0,2) == gruppe.KUERZEL

                                                         select gruppenFeld;


               foreach (DtoGruppenFeld gruppenFeld in abfrageGruppenfeld)

               {

                  // befüllen der txt.Datei

                  zeile = string.Format("{0,-2}{1,-70}{2,-2}{3,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG );


                  writer.WriteLine(zeile);

               }

            }

Geschrieben

Ich hab mir das mit Join angeschaut, aber ich wills trotzdem erstmal mit LINQ versuchen.

Irgendwie muss ich doch der Abfrage sagen, dass ich auch die Gruppen will die eben nicht gleich dem Kürzel der Gruppenfelder sind. Also auch die Gruppen die KEIN Gruppenfeld haben bzw. wo Gruppenfeld null ist.

Geschrieben
Ich hab mir das mit Join angeschaut, aber ich wills trotzdem erstmal mit LINQ versuchen.
Das widerspricht sich nicht. Man kann JOINS mit LINQ machen, nur weiß ich nicht, wie das geht, weil ich noch nie LINQ benutzt habe.

Irgendwie muss ich doch der Abfrage sagen, dass ich auch die Gruppen will die eben nicht gleich dem Kürzel der Gruppenfelder sind. Also auch die Gruppen die KEIN Gruppenfeld haben bzw. wo Gruppenfeld null ist.

Du bekommst diese Gruppen ja auch in der äußeren Abfrage. Aber die innere Abfrage liefert für diese Gruppen keine Ergebnisse, und erzeugt daher auch keine Ausgabe.
Geschrieben

Du bekommst diese Gruppen ja auch in der äußeren Abfrage. Aber die innere Abfrage liefert für diese Gruppen keine Ergebnisse, und erzeugt daher auch keine Ausgabe.

Jop stimmt, aber wie löse ich das ?

Geschrieben

Das ist jetzt nicht besonders sauber, aber du könntest dir über eine bool-Variable merken, ob du für eine Gruppe eine Gruppenfeld-Ausgabe gemacht hast.

Falls du nach der inneren Schleife feststellst, dass das für die aktuelle Gruppe nicht geschehen ist, kannst du eine Ausgabe ohne Gruppenfeld hinterherschieben.

Geschrieben

Kapier ich jetzt nicht ganz, aber ich könnte doch auch mir die Gruppen merken - in einer Liste oder so - und dann nochmals prüfen gegen die Liste, und wenn die Gruppe nicht in der Liste dann hinschreiben ?

Geschrieben

Okey, ich habe jetzt 2 Listen.

1.Liste hat alle Gruppen die reingeschrieben wurden.

2.Liste hat alle Gruppen.

Jetzt will ich folgendes machen : Für jedes Element welches in Liste 2 ist aber nicht in Liste 1 soll etwas getan werden.

Wie schreibe ich das als Code?

Geschrieben

Das ist meiner Meinung nach viel zu kompliziert.

            foreach (DtoGruppe gruppe in abfrageGruppe)
{
IQueryable<DtoGruppenFeld> abfrageGruppenfeld = from gruppenFeld in dmc.DbGruppenFelder
where gruppenFeld.KUERZEL.Substring(0,2) == gruppe.KUERZEL
select gruppenFeld;

bool gefunden = false;
foreach (DtoGruppenFeld gruppenFeld in abfrageGruppenfeld)
{
// befüllen der txt.Datei
zeile = string.Format("{0,-2}{1,-70}{2,-2}{3,-70}", gruppe.KUERZEL, gruppe.BEZEICHNUNG, gruppenFeld.KUERZEL, gruppenFeld.BEZEICHNUNG );

writer.WriteLine(zeile);
gefunden = true;
}
if(!gefunden)
{
// Zeile ohne Gruppenfeld ausgeben
}
}[/code]

Geschrieben

Hey super. Vielen dank ;)

Hoffentlich krieg ich das nach ner Zeit auch so gut hin & schnell :-D

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...