Fragensteller
Bulkcopy verliert Daten beim Einlesen von Excel

Allgemeine Diskussion
-
Hi,habe ein Excel-Datei mit ca. 4MB Es sind 21.500 Datensätze drin mit 53 Spalten. Auf meine Rechner local und auf unserem test-Rechner funktioniert es, wir bekommen alle Datensätze in die SQL-Server-Tabelle rein. Doch wenn ich die Web-App auf unseren externen rechner publishe und dort den Import starte, werden nur ca. 19.500 Sätze importiert. Gleiche Tabelle, gleicher Source. Kann es sein, dass irgendwelche Speicherfreigaben uns hier einen Streich spielen? Oder ist das Ganze so empfindlich, dass wenn in einer der Excel-Zellen z.B. Null drin steht oder ein anderes unsichtbares Zeichen, dass dann der Vorgang beendet wird, ohne Fehler?
Alle Lösungsansätze sind bisher im Sand verlaufen
using (OleDbConnection oleConnection = oleDbConnection) { using (OleDbCommand oCmd = new OleDbCommand()) { oCmd.Connection = oleConnection; oCmd.CommandText = pSql; oCmd.CommandType = CommandType.Text; oleConnection.Open(); using (OleDbDataReader dr = oCmd.ExecuteReader()) { using (SqlConnection connection = oConnection) { using (SqlBulkCopy bulkCopy = new SqlBulkCopy(oConnection)) { connection.Open(); bulkCopy.DestinationTableName = pDestTable; bulkCopy.ColumnMappings.Clear(); foreach (var param in sourceTargetFieldPairs) { bulkCopy.ColumnMappings.Add(param.Key.ToString(), param.Value.ToString()); } bulkCopy.WriteToServer(dr); retStatus = true; } connection.Close(); } } } oleConnection.Close(); }
Wenn ich Spalten wegnehme, die in der Datei sind, die ich aber nicht fürs Einlesen brauche (nur für den Test) dann funktioniert es.
Gruß Hipp
- Typ geändert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 4. August 2016 12:41 Keine bestätigte Lösung
Alle Antworten
-
Hallo,
wenn die überflüssigen Spalten das Problem sind, so lasse sie beim ColumMapping weg.
Das vermutliche Problem ist, dass der OleDbProvider den Spalten einen anderen Datentyp zuordnet, als sich später darin befinden, dadurch wird für die Zeile ein Fehler ermittelt und sie ausgelassen. Siehe, neben anderen:
IMEX=1 revisit and TypeGuessRows setting change to 0 (watch for performance)
für eine mögliche Abhilfe, ansonsten muss die Datei bereinigt werden.
Gruß Elmar
-
Hi,
vielen Dank.
Ich werde das u.U. mit integrieren.
Doch erstaunlich ist, wenn ich die Daten in Excel verkehrt herum sortiere und abspeichere, das nun die Zeilen, die normalerweis am Ende standen und nicht importiert wurden und jetzt am Anfang stehen alle importiert werden.
Außerdem bekomme ich bereits gemeldet, wenn ein Text in einer Spalte steht, obwohl der Inhalt z.B. Decimal sein müsste, weil die DB-Def so ist.
Gruß Hipp
-
Hallo Hipp,
dass das Sortieren solche Auswirkungen hat, lässt vermuten, dass dort mal "Text" mal "Zahl" angenommen wird.
Man sollte nie vergessen, dass Excel keine relationale Datenbank ist und Datentypen häufig so interpretiert wie es anhand der Situation vermutet, mal als Text, mal als Zahl oder auch Datum.
Der (Jet) OleDb Treiber versucht seinerseits das Beste daraus zu machen und nimmt den "häufigsten" Datentyp einer Spalte als "richtig" an.
Gruß Elmar
-
Hi Elmar,
leider muss ich Dir da bezüglich Sortierung wiedersprechen. Durch das Sortieren wird ganz klar belegt, dass es etwas mit dem Speicher zu tun hat. Denn wenn ich die 12 letzten Sätze ans Ende der Datei stelle, fehlen sie. Wenn sich diese am Anfang befinden, so sind so sauber drin, dafür fehlen u.A. jetzt die letzten 12 Sätze.
Genauso der Versuch, wenn ich unnötige Spalten, die ich nicht im Select drin habe aus der Excel-Datei entferne, dass ich dann einige Hundert mehr Importieren kann. An den Daten der übrigen eingelesenen Spalten wurde NICHTS verändert. Bis auf 3 Spalten ist alles als Text (varchar()) definiert.
Gleiche Source, gleiche DB, unterschiedliche Rechner: Unterschiedliches Ergebnis. Es fehlen immer die letzten ca. 2000 Sätze !
Gruß Hipp
-
Hallo Hipp,
den Widerspruch kann nicht nicht so ganz akzeptieren ;)
Denn je nach dem wie Du sortierst, können die Datentypen der Spalten andere sein, schließlich wird die Information anhand der ersten Zeilen (und nicht dem Ende) festgelegt.
Ich würde mal die Datei in Access importieren und gucken was dabei an Datentypen rauskommt und welche Zeilen warum ignoriert werden.
Gruß Elmar
-
Hallo Elmar,
verstehe ich und ist akzeptiert. Ich habe die Datei in Access vorwärts und rückwärts importiert und es wurden jeweils die gleichen ausgefiltert. Hier habe ich allerding alles genommen und er hat Zeilen ausgefiltert mit Spalten, die ich normalerweise nicht verwende. Leider auch bei dem versuch, nur die Spalten zu nehmen, die ich brauche. Das ist ein Bug. Denn er bringt mir Fehler beim Konvertieren der Spalteninhalte für Spalten, die ich nicht importiert haben. Aber das eine andere Baustelle.
Ich werde das mit EPPLUS versuchen. Mal sehen was da passiert.Merci vielmals.
Gruß Hipp