Laden...

CSV Import in SQL Tabelle

Erstellt von Paul29C vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.459 Views
P
Paul29C Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren
CSV Import in SQL Tabelle

verwendetes Datenbanksystem: <sql>

Hi,
vielfach behandelt aber bisher finde ich leider keine passende Lösung für mein Problem:
ich verwende die populäre Filehelpers Bibliothek um eine CSV Datei einzulesen.
Das klappt soweit auch sehr gut. Nun möchte ich das Ergebnis gerne in eine SQL Tabelle speichern (statt wie in meinem Beispiel in ein File).
Könntet ihr mir da bitte weiterhelfen? (Die CSV Dateien haben eigentlich nie mehr als 10000 Zeilen, sind also nicht allzu groß, falls ihr das noch als Info benötigt).

 public void GetNewCSV()
        {
            string path = @"C:\temp\CSV\";
            var engine = new FileHelperEngine<Mapping>();
            var result = engine.ReadFile(path + "testfile.csv");

            engine.WriteFile(path + "FileOut.csv", result);

        }

und das dazugehörige Mapping:

 
[DelimitedRecord(";")]
[IgnoreEmptyLines()]
        public class ExampleMapping
        {
            public string Cell1;
            public string Cell2;
            public string Cell3;
            public string Cell4;          
        }


Vielen Dank schon mal
Paul

16.806 Beiträge seit 2008
vor 4 Jahren

Du musst den Leuten schon ne Frage stellen oder zumindest erklären, was Du bisher versucht hast und wo Du nicht weiter kommst.
[Hinweis] Wie poste ich richtig?
Beachte aber, dass das Forum kein kostenloser Quellcode-Generator ist 😉

P
Paul29C Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Verstehe 😃,

Ich habe mir das in etwa so vorgestellt, also mit BulkCopy zu arbeiten, das Problem ist, dass ich mich damit nicht so gut auskenne und nicht so Recht weiß wie ich die eingelesen Daten übergeben soll (daher auch die XXX):

Meine Frage wäre also zunächst was die Empfehlung wäre was das anschließende Verarbeiten angeht? Von BulkCopy habe ich öfter gelesen, das soll ganz gut und schnell sein.
Aber wie gesagt wie übergebe ich da die Daten? Danke schon mal

public void BulkCopy()
        {
            DataSet ds = XXX;

            SqlConnection con = new SqlConnection(@"Data Source=...\SQLEXPRESS;Initial    
            Catalog=DBTest;Integrated Security=SSPI");
            SqlBulkCopy bulk = new SqlBulkCopy(con);
            bulk.DestinationTableName = "TestTable";
            foreach (DataColumn col in ds.Tables[0].Columns)
            bulk.ColumnMappings.Add(col.ColumnName, col.ColumnName);
            con.Open();
            bulk.WriteToServer(ds.Tables[0]);
            con.Close();
        }
Hinweis von Abt vor 4 Jahren

Keine Full Quotes [Hinweis] Wie poste ich richtig?

2.298 Beiträge seit 2010
vor 4 Jahren

Wenn ich dich richtig verstehe scheiterst du an der Anbindung der Datenbank. Sofern du dich schon für eine Datenbank entschieden hast such einfach mal nach ADO.NET bzw. ganz allgemein nach Anbindung von Datenbanken an C# Programmen.

Wenn du dich weit genug damit beschäftigt hast noch folgende Links als Hilfestellung:

Abfragen nicht fest coden sondern auf Parameter setzen:
[Artikelserie] SQL: Parameter von Befehlen

Eine Client-Klasse für den Datenbankunabhängigen Zugriff:
DatenbankClient ADO.NET - Providerunabhängig

EDIT: Ich glaube SqlBulkCopy ist nicht der richtige Weg. Allein schon aufgrund deiner Datenquelle.
Meines Erachtens nach sollte es auch kein Problem darstellen, den Insert der Daten selbst zu schreiben und Zeilenweise in die Datenbank zu schreiben.

Quasi etwas in der Richtung:


- CSV Datei einlesen
- Solange Zeile vorhanden
             Zeile in Datenbank schreiben

So bist du am Ende auch flexibler wenn bestimmte Zeilen ausgeschlossen oder manipuliert werden sollen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

1.696 Beiträge seit 2006
vor 4 Jahren

Ich habe mir das in etwa so vorgestellt, also mit BulkCopy zu arbeiten, das Problem ist, dass ich mich damit nicht so gut auskenne und nicht so Recht weiß wie ich die eingelesen Daten übergeben soll (daher auch die XXX)

Google mal nach "c# csv in datatable", da findest du viele Lösungswege, somit hast du die Daten in Datatable, dann kannst du mit BulkCopy weitermachen.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

P
Paul29C Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Vielen Dank schon mal für deine Hilfe, dein Ansatz klingt sehr gut (den sollte ich Dank deiner Anleitung 😉, auch hinbekommen), das einzige Problem, dass ich nach wie vor so ein bisschen habe,
einer der großen Vorteile von FileHelpers ist ja, dass man da sehr wenig Code benötigt um ein File einzulesen und das ist gleichzeitig glaube ich so ein bisschen mein Problem.

Ich weiß nicht so Recht wie ich das eingelesene "var result" weiter verarbeiten kann, also in deinem Fall z.B. wie wandel ich das eingelesene Ergebnis in die Zeilen um, die du erwähnst.

Hinweis von Abt vor 4 Jahren

Keine Full Quotes [Hinweis] Wie poste ich richtig?

2.298 Beiträge seit 2010
vor 4 Jahren

Ich kenne die verwendete Klasse nicht vermute aber dass ein IEnumerable<Mapping> oder eine List<Mapping> zurück geliefert wird.

Diese kannst du ganz einfach Zeilenweise durchlaufen. Beispiel:


foreach(Mapping entry in result)
{
     // schreibe Eintrag in Datenbank
}

Anfängern rate ich übrigens von der Verwendung von "var" ab. - Denn ohne das sieht man sofort um welchen Datentyp es sich handelt.

Solltest du den Weg mit BulkCopy weiter verfolgen wollen, folge mal der Anweisung von vbprogger. Bin mir allerdings nicht sicher ob einem Programmieranfänger auf die Weise geholfen ist.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

P
Paul29C Themenstarter:in
5 Beiträge seit 2019
vor 4 Jahren

Danke, ich werde mir das ansehen

Hinweis von Abt vor 4 Jahren

Keine Full Quotes [Hinweis] Wie poste ich richtig?

16.806 Beiträge seit 2008
vor 4 Jahren

Bitte endlich an [Hinweis] Wie poste ich richtig? halten und die Full Quotes unterlassen.
Du suchst hier Hilfe - ergo halte Dich bitte an die Regeln.
Danke.

Ansonsten der Hinweis, dass ein Software Entwickler durchaus auch mal Themen anschauen muss, bevor er sie verwenden kann. Lernen - Verstehen - Anwenden.
Kein Meister ist einfach so vom Himmel gefallen - wir haben alle mal mit wenig Ahnung angefangen.
Deswegen heisst es auch "Entwickler" und nicht "Zusammen Kopierer" 😉