Announcement

Collapse
No announcement yet.

Von DataTable in .csv?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Von DataTable in .csv?

    Hallo Leute,

    wollte mich erst einmal vorstellen. Bin 21 Jahre alt und programmiere seit kurzen viel C#. Bin allerdings neuling in Datenbanktechnologien. Ich habe ein Programm geschrieben was eine SQL-Datenbank in eine DataTable einlädt und im DataGridView ausgibt. Ich kann auch Daten eingeben und zurückschreiben. Doch nun möchte ich auch die DataTable in einer csv speichern. Habe schon einen ansatz aber da schreibt er wohl die csv datei, aber ohne inhalt

    Code:
    string fileName = data + "test.csv";
                StreamWriter writer = File.CreateText(fileName);
                foreach (DataRow dr in data.Rows)
                {
                    foreach (DataColumn dc in dr.Table.Columns)
                    {
                        writer.Write(dr[dc]);
                        writer.Write(",");
                    }
    
                    writer.Write("\n");
    
                }
                MessageBox.Show("success");
    Ich hoffe mir kann jemand einen Denkanstoss geben!

    Gruß

    J.D.

  • #2
    Hallo,

    wenn ich mir StreamWriter.Write() anschaue, gibt es viele Varianten - abhängig vom Datentyp. Du überlässt es NET, diesen herauszufinden. DataRow[DataColumn] liefert zwar den gewünschten Feldinhalt, aber als object. Du musst ihn also erst noch konvertieren, damit die Write-Methode den Wert richtig interpretieren und umsetzen kann.

    Dazu hast Du mehrere Möglichkeiten:
    • Am einfachsten, aber am langwierigsten zu schreiben:
      Code:
      switch(dc.DataType) { 
          case typeof(string): writer.Write((string)dr[dc]); break; 
          //  usw. 
      }
      Das wird aber schwieriger, weil switch numerische Typen oder Strings erwartet.
    • Das gleiche Verfahren mit if - else if - else if usw.
    • Benutze eine allgemeine Konvertierungsanweisung:
      Code:
      writer.Write( Convert.ChangeType(dr[dc], dc.DataType) );
    • Vielleicht funktioniert auch die Variante TextWriter.Write-Methode (String, Object) unmittelbar (jedenfalls klingt die Beschreibung in der SDK-Doku danach), also:
      Code:
      writer.Write("{0}", dr[dc]);

    Viel Erfolg! Jürgen

    Nachtrag: Dein Verfahren ist natürlich geeignet, wenn Du damit lernen willst und/oder selbst die Kontrolle behalten willst. Für kommerzielle Lösungen gibt es andere Möglichkeiten: (a) Ich glaube, der MSSQL-Server hat eine "eingebaute" Funktion dafür. (b) den Microsoft Text Driver, siehe z.B. http://msdn2.microsoft.com/en-us/library/ms709353.aspx (c) Lösungen unter CodeProject, z.B. http://www.codeproject.com/KB/databa...export_db.aspx
    Zuletzt editiert von Jürgen Thomas; 18.01.2008, 12:44. Reason: Nachtrag hinzugefügt

    Comment


    • #3
      Ich schau einfach noch mal in die Doku rein, es klappt einfach noch nicht. Ich kann machen was ich will, er schreibt nur eine leere Datei. :-(

      Danke für deine Antwort. Falls noch jemand mit anregungen da ist, kann gerne schreiben. Würde mich freuen.

      Gruß
      Zuletzt editiert von J.D.; 19.01.2008, 10:40.

      Comment


      • #4
        Originally posted by J.D. View Post
        Ich schau einfach noch mal in die Doku rein, es klappt einfach noch nicht. Ich kann machen was ich will, er schreibt nur eine leere Datei.
        Vorschlag zur Fehlersuche: Benutze meine "if else if"-Variante, damit Du genau den Datentyp siehst und den tatsächlichen Feldinhalt. Teile den Code auf in mehrere Zeilen und gehe mit dem Debugger durch:
        Code:
        string sTemp;
        string dataType = dc.DataType.Name;
        if (dr.IsNull(dc)) {
           sTemp = "NULL";
        } else if (dc.DataType == typeof(string)) {
           sTemp = (string)dr[dc];
        } else if (dc.DataType == typeof(int)) {
           int iTemp = (int)dr[dc];
           sTemp = iTemp.ToString();
        } else if (dc.DataType == typeof(short)) {
           //  usw.
        Dabei müsstest Du feststellen, was nicht funktioniert. Mit den bisherigen Informationen kann ich nur raten (abgesehen von meinem grundlegenden Hinweis).

        Viel Erfolg! Jürgen

        Comment


        • #5
          Danke für deine hilfe, ich werde mich gleich (nachdem ich bei einem Kunden war) dran setzen und probieren. Ich poste dann mal ob es funktioniert hat bzw. wie es dann funktioniert hat. Oder auch halt nicht

          Vielen Dank erst einmal Jürgen.

          Gruß

          J.D.

          Comment


          • #6
            Hallo ich habe mir mal ein snippet von .NET-Snippets besorgt um mal zu testen.
            Code:
            public void WriteDataTable(string path, DataTable data, char seperator)
                    {
                        
                        
                        path = "test2.csv";
                        using (StreamWriter sw = new StreamWriter(path, false,  System.Text.Encoding.Default))
                        {
                            int numberOfColumns = data.Columns.Count;
            
                            for (int i = 0; i < numberOfColumns; i++)
                            {
                                sw.Write(data.Columns[i]);
                                if (i < numberOfColumns - 1)
                                    sw.Write(seperator);
                            }
                            sw.Write(sw.NewLine);
            
                            foreach (DataRow dr in data.Rows)
                            {
                                for (int i = 0; i < numberOfColumns; i++)
                                {
                                    sw.Write(dr[i].ToString());
            
                                    if (i < numberOfColumns - 1)
                                        sw.Write(seperator);
                                }
                                sw.Write(sw.NewLine);
                            }
                        }
                    }
            Nun möchte ich das ja mit einem Buttonklick ausführen:

            Code:
            public void toolStripButton5_Click(object sender, EventArgs e) 
                    {
            
                       WriteDataTable(string path, DataTable data, char seperator);
                    
                    }
            Logisch ist ja, wenn ich die parameter weglasse das der mir einen overload fehler raushaut, doch auch so haut der mir nur fehler raus und lässt mich nicht starten...Was mache ich falsch...Glaube ich hab hier gerad voll die denksperre

            Gruß

            edit:
            Ich pappnase, ich muss sie ja auch erst deklarieren....Hat funktioniert, mein Fehler :-)
            Zuletzt editiert von J.D.; 24.01.2008, 14:57.

            Comment

            Working...
            X