Ich möchte CSV-Dateidaten von C # -Code auf SQL Server 2005 per Bulk-Upload hochladen, aber es tritt der folgende Fehler auf:
Erhielt eine ungültige Spaltenlänge vom bcp-Client für Spalte 6.
Wenn eine Massenkopie auf den Datenbankserver geschrieben wird
c#
.net
sql-server
database
sql-server-2005
Sana Sana
quelle
quelle
Ich weiß, dass dieser Beitrag alt ist, aber ich bin auf dasselbe Problem gestoßen und habe schließlich eine Lösung gefunden, um festzustellen, welche Spalte das Problem verursacht hat, und es bei Bedarf zurückzumelden. Ich habe festgestellt, dass die
colid
in der SqlException zurückgegebene Version nicht auf Null basiert. Sie müssen also 1 davon subtrahieren, um den Wert zu erhalten. Danach wird es als Index der_sortedColumnMappings
ArrayList der SqlBulkCopy-Instanz verwendet, nicht als Index der Spaltenzuordnungen, die der SqlBulkCopy-Instanz hinzugefügt wurden. Eine Sache zu beachten ist, dass SqlBulkCopy beim ersten empfangenen Fehler stoppt, so dass dies möglicherweise nicht das einzige Problem ist, aber zumindest hilft, es herauszufinden.quelle
Beim Übergeben einer Zeichenfolge an die Datenbanktabelle mit der Option SQL BulkCopy trat ein ähnliches Problem auf. Die Zeichenfolge, die ich übergeben habe, bestand aus 3 Zeichen, während die Länge der Zielspalte betrug
varchar(20)
. Ich habe versucht, die Zeichenfolge vor dem Einfügen in die Datenbank mithilfe derTrim()
Funktion zu kürzen, um zu überprüfen, ob das Problem auf Leerzeichen (führende und nachfolgende) in der Zeichenfolge zurückzuführen ist. Nach dem Trimmen der Saite funktionierte es gut.Du kannst es versuchen
text.Trim()
quelle
Überprüfen Sie die Größe der Spalten in der Tabelle, die Sie als Masseneinfügung / -kopie ausführen. Der varchar oder andere Zeichenfolgenspalten müssen möglicherweise erweitert werden, oder der Wert, den Sie einfügen, muss gekürzt werden. Die Spaltenreihenfolge sollte auch der Tabelle entsprechen.
zB Erhöhen Sie die Größe der Varchar-Spalte 30 auf 50 =>
ALTER TABLE [dbo]. [TableName] ALTER COLUMN [ColumnName] Varchar (50)
quelle
Toller Code, danke fürs Teilen!
Am Ende habe ich Reflection verwendet, um den tatsächlichen DataMemberName zu erhalten, der bei einem Fehler an einen Client zurückgegeben werden kann (ich verwende Bulk Save in einem WCF-Dienst). Hoffentlich findet jemand anderes, wie ich es gemacht habe, nützlich.
quelle
Ich habe diese Fehlermeldung mit einer viel neueren SSIS-Version erhalten (im Vergleich zu 2015 Enterprise, ich denke, es ist SSIS 2016). Ich werde hier einen Kommentar abgeben, da dies die erste Referenz ist, die beim Google dieser Fehlermeldung angezeigt wird. Ich denke, es passiert meistens mit Zeichenspalten, wenn die Quellzeichengröße größer als die Zielzeichengröße ist. Ich habe diese Nachricht erhalten, als ich eine ado.net-Eingabe für ms sql aus einer Teradata-Datenbank verwendet habe. Witzig, weil das vorherige oledb-Schreiben in ms sql die gesamte Zeichenkonvertierung ohne Codierungsüberschreibungen perfekt handhabte. Die Colid-Nummer und die entsprechende Ziel-Eingabespalte #, die Sie manchmal mit der Colid-Nachricht erhalten, sind wertlos. Es ist nicht die Spalte, wenn Sie vom oberen Rand des Mappings herunterzählen oder ähnliches. Wenn ich Microsoft wäre, würde ich ' Es ist peinlich, eine Fehlermeldung zu geben, die so aussieht, als würde sie auf die Problemspalte zeigen, wenn dies nicht der Fall ist. Ich fand das Problem kolid, indem ich eine fundierte Vermutung anstellte und dann die Eingabe für die Zuordnung in "Ignorieren" änderte und dann erneut ausführte und prüfte, ob die Nachricht verschwunden war. In meinem Fall und in meiner Umgebung habe ich es durch substr behoben (indem ich die Teradata-Eingabe auf die Zeichengröße der ms sql-Deklaration für die Ausgabespalte eingestellt habe. Überprüfen Sie, ob sich Ihr Eingabesubstrat über alle Datenkonvertierungen und -zuordnungen verbreitet Falls dies nicht der Fall war und ich alle meine Datenkonvertierungen und Zuordnungen löschen und von vorne beginnen musste. Wieder komisch, dass OLEDB es gerade behandelt hat und ADO.net den Fehler geworfen hat und all diese Eingriffe haben musste, damit es funktioniert. Im Allgemeinen Sie sollte OLEDB verwenden, wenn Ihr Ziel MS Sql ist. s zeigt auf die Problemspalte, wenn dies nicht der Fall ist. Ich fand das Problem kolid, indem ich eine fundierte Vermutung anstellte und dann die Eingabe für die Zuordnung in "Ignorieren" änderte und dann erneut ausführte und prüfte, ob die Nachricht verschwunden war. In meinem Fall und in meiner Umgebung habe ich es durch substr behoben (indem ich die Teradata-Eingabe auf die Zeichengröße der ms sql-Deklaration für die Ausgabespalte eingestellt habe. Überprüfen Sie, ob sich Ihr Eingabesubstrat über alle Datenkonvertierungen und -zuordnungen verbreitet Falls dies nicht der Fall war und ich alle meine Datenkonvertierungen und Zuordnungen löschen und von vorne beginnen musste. Wieder komisch, dass OLEDB es gerade behandelt hat und ADO.net den Fehler geworfen hat und all diese Eingriffe haben musste, damit es funktioniert. Im Allgemeinen Sie sollte OLEDB verwenden, wenn Ihr Ziel MS Sql ist. s zeigt auf die Problemspalte, wenn dies nicht der Fall ist. Ich fand das Problem kolid, indem ich eine fundierte Vermutung anstellte und dann die Eingabe für die Zuordnung in "Ignorieren" änderte und dann erneut ausführte und prüfte, ob die Nachricht verschwunden war. In meinem Fall und in meiner Umgebung habe ich es durch substr behoben (indem ich die Teradata-Eingabe auf die Zeichengröße der ms sql-Deklaration für die Ausgabespalte eingestellt habe. Überprüfen Sie, ob sich Ihr Eingabesubstrat über alle Datenkonvertierungen und -zuordnungen verbreitet Falls dies nicht der Fall war und ich alle meine Datenkonvertierungen und Zuordnungen löschen und von vorne beginnen musste. Wieder komisch, dass OLEDB es gerade behandelt hat und ADO.net den Fehler geworfen hat und all diese Eingriffe haben musste, damit es funktioniert. Im Allgemeinen Sie sollte OLEDB verwenden, wenn Ihr Ziel MS Sql ist. Ich fand das Problem kolid, indem ich eine fundierte Vermutung anstellte und dann die Eingabe für die Zuordnung in "Ignorieren" änderte und dann erneut ausführte und prüfte, ob die Nachricht verschwunden war. In meinem Fall und in meiner Umgebung habe ich es durch substr behoben (indem ich die Teradata-Eingabe auf die Zeichengröße der ms sql-Deklaration für die Ausgabespalte eingestellt habe. Überprüfen Sie, ob sich Ihr Eingabesubstrat über alle Datenkonvertierungen und -zuordnungen verbreitet Falls dies nicht der Fall war und ich alle meine Datenkonvertierungen und Zuordnungen löschen und von vorne beginnen musste. Wieder komisch, dass OLEDB es gerade behandelt hat und ADO.net den Fehler geworfen hat und all diese Eingriffe haben musste, damit es funktioniert. Im Allgemeinen Sie sollte OLEDB verwenden, wenn Ihr Ziel MS Sql ist. Ich fand das Problem kolid, indem ich eine fundierte Vermutung anstellte und dann die Eingabe für die Zuordnung in "Ignorieren" änderte und dann erneut ausführte und prüfte, ob die Nachricht verschwunden war. In meinem Fall und in meiner Umgebung habe ich es durch substr behoben (indem ich die Teradata-Eingabe auf die Zeichengröße der ms sql-Deklaration für die Ausgabespalte eingestellt habe. Überprüfen Sie, ob sich Ihr Eingabesubstrat über alle Datenkonvertierungen und -zuordnungen verbreitet Falls dies nicht der Fall war und ich alle meine Datenkonvertierungen und Zuordnungen löschen und von vorne beginnen musste. Wieder komisch, dass OLEDB es gerade behandelt hat und ADO.net den Fehler geworfen hat und all diese Eingriffe haben musste, damit es funktioniert. Im Allgemeinen Sie sollte OLEDB verwenden, wenn Ihr Ziel MS Sql ist. s und Mappings und von vorne beginnen. Wieder lustig, dass OLEDB gerade damit umgegangen ist und ADO.net den Fehler geworfen hat und all diese Eingriffe haben musste, damit es funktioniert. Im Allgemeinen sollten Sie OLEDB verwenden, wenn Ihr Ziel MS Sql ist. s und Mappings und von vorne beginnen. Wieder lustig, dass OLEDB gerade damit umgegangen ist und ADO.net den Fehler geworfen hat und all diese Eingriffe haben musste, damit es funktioniert. Im Allgemeinen sollten Sie OLEDB verwenden, wenn Ihr Ziel MS Sql ist.
quelle
Ich bin gerade darauf gestoßen und konnte mit dem Snippet von @ b_stil die Spalte mit den Tätern herausfinden. Bei weiteren Untersuchungen stellte ich fest, dass ich die Spalte genau so zuschneiden musste, wie @Liji Chandran vorgeschlagen hatte, aber ich verwendete IExcelDataReader und konnte keine einfache Möglichkeit finden, jede meiner 160 Spalten zu validieren und zu beschneiden.
Dann bin ich auf diese Klasse gestoßen (ValidatingDataReader) von CSVReader .
Das Interessante an dieser Klasse ist, dass sie die Datenlänge der Quell- und Zielspalten, die Täterzeile und sogar den Spaltenwert angibt, der den Fehler verursacht.
Ich habe nur alle Spalten (nvarchar, varchar, char und nchar) abgeschnitten.
Ich habe gerade meine
GetValue
Methode dahingehend geändert :Hoffe das hilft jemandem
quelle