Feedback

CSV und XML-Datei Datenbank-Import (incl. valid-check)

„);

//using System.Data;
//using System.Data.SqlClient;
//using System.IO;

private void CSV_XML_nach_Datenbank(String dateiPfad, String ZielTabelle, SqlConnection con)
{
//knoxyz 14.11.2008
    try
    {
        DateTime startzeit = System.DateTime.Now;

        //stellt Vermittler zwischen DatenQuelle(sqlServer) und DatenZiel(DataSet/DataTable) dar
        SqlDataAdapter da = new SqlDataAdapter();

        //enthält Tabellen
        DataSet ds = new DataSet();

        SqlCommand cmd = new SqlCommand();  //der sqlCommand nimmt SQL-Befehle entgegen
        cmd.Connection = con;               //generell festlegen, für welche Datenbank er diese Befehle ausführen soll

        //ggf Verbindung herstellen
        if (con.State != ConnectionState.Open) con.Open();

        String schemaPfad = Application.StartupPath + @"Schema_" + ZielTabelle + ".xsd";

        //(Optional) Per TableMapping können Tabellen einen Namen gegeben werden. Alte Einträge entfernen
        da.TableMappings.Clear();

        //Welche Datenbankt
        cmd.CommandText = "SELECT * FROM " + ZielTabelle;


        da.SelectCommand = cmd;
        da.TableMappings.Add("Table", ZielTabelle);
        ds.Clear();
        if (File.Exists(schemaPfad) == false) //Fall keine Schemadatei vorhanden ist, jetzt eine erstellen
        {                                    //sofern Änderungen an der Datenbank gemacht wurden, die Schema.xsd einfach löschen
            da.Fill(ds); //Tabellen des DataAdapter in ein DataSet schreiben
            da.FillSchema(ds, SchemaType.Source); //Schema(Aufbau) der SQL-Tabellen auch im DataSet übernehmen
            ds.WriteXmlSchema(schemaPfad); //Schema lokal speichern
        }
        //ds.WriteXml(schemaPfad + ".xml");//Schema und Daten lokal speichern (BackUp)


        //Ziel-SQL-Tabelle
        //  anders als hier, schicke ich die Daten erst an eine Temp-Tabelle, die den gleichen Aufbau wie die eigentliche Ziel-Tabelle hat,
        //  und frage per Exist-Befehl anhand verschiedener Kriterien ab, ob Datensätze evtl. in der Ziel-Tab bereits vorhanden sind.
        DataTable dt = new DataTable("Artikelstamm");

        //um zu überprüfen ob die CVS-Daten zur SQL-Tabelle passen, hier das Schema der Datenbank übergeben
        dt.ReadXmlSchema(schemaPfad);

        //festlegen wo die CSV zu finden ist, die wir an die Datenbank schicken wollen

        //Wurde eine eine 'xml-Datei' ausgesucht..
        if (dateiPfad.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
        {
            dt.ReadXml(dateiPfad);
        }
        else
        {
            if (//...oder CSV/Textdatei?
                (dateiPfad.EndsWith(".csv", StringComparison.OrdinalIgnoreCase))
                || (dateiPfad.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
               )
            {
                StreamReader DateiLeser = new StreamReader(dateiPfad, System.Text.Encoding.Default);

                //Die nachfolgende Replace-Aufrufe entfernen Sonderzeichen, die mögliche Probleme verursachen könnten
                //Spaltenüberschriften auslesen und ggf. Punkte mit Unterstrich ersetzen
                String Zeileninhalt = DateiLeser.ReadLine().Replace(".", "_").Replace("t", ";");
                DateiLeser.ReadLine(); //Leerzeile falls Daten erst in 3ter Zeile beginnen


                char trennzeichen = ';';
                //Der Inhalt der CSV-Datei wird Zeile für Zeile ausgelesen und in eine DataTable geschrieben
                while (DateiLeser.EndOfStream == false)
                {
                    Zeileninhalt = DateiLeser.ReadLine().Replace("'", "").Replace(";", "").Replace("=", "").Replace("""

5 Kommentare

  1. Gibt es eine Möglichkeit sein „Snippet“ zu bearbeiten?

    Diese usings werden benötigt:
    using System.Data;
    using System.Data.SqlClient;
    using System.IO;

  2. Gute Einwand den SqlConnectionStringBuilder zu benutzen,
    da dieser, noch vor dem Versuch eine Verbindung aufzubauen,
    überprüft, ob nur gültige Werte für die Verbindungseigenschaften angegeben wurden.
    (Bsp: für TimeOut keine Buchstaben zugelassen, ect)

    Habe es im Code entsprechend angepasst.