webentwicklung-frage-antwort-db.com.de

SQLException: String- oder Binärdaten würden abgeschnitten

Ich habe einen C # -Code, der viele Einfügeanweisungen in einem Stapel ausführt. Während der Ausführung dieser Anweisungen erhielt ich den Fehler "String oder binäre Daten würden abgeschnitten" und die Transaktion roledback. 

Um herauszufinden, welche insert-Anweisung dies verursacht hat, muss ich den SQLServer nacheinander einfügen, bis der Fehler angezeigt wird.

Gibt es eine clevere Methode, um herauszufinden, welche Anweisung und welches Feld dieses Problem durch Ausnahmebehandlung verursacht hat? (SqlException)

54
ramanasv

Im Allgemeinen gibt es keine Möglichkeit festzustellen, welche Anweisung den Fehler verursacht hat. Wenn Sie mehrere ausführen, können Sie sich den Profiler ansehen und die letzte abgeschlossene Anweisung betrachten und sehen, wie die Anweisung danach aussehen könnte. Ich habe jedoch keine Ahnung, ob dieser Ansatz für Sie machbar ist.

In jedem Fall ist eine Ihrer Parametervariablen (und die darin enthaltenen Daten) zu groß für das Feld, in dem die Daten gespeichert werden sollen. Überprüfen Sie Ihre Parametergrößen mit den Spaltengrößen, und die betreffenden Felder sollten schnell ersichtlich sein.

69
Adam Robinson

Diese Art von Fehler tritt auf, wenn der Datentyp der SQL Server-Spalte eine Länge hat, die kleiner ist als die Länge der Daten, die in das Eingabeformular eingegeben wurden.

17
Jasmin Chauhan

diese Art von Fehler tritt im Allgemeinen auf, wenn Sie Zeichen oder Werte über die in der Datenbanktabelle angegebenen Werte setzen müssen, wie in diesem Fall: Sie geben. transaction_status varchar (10) Sie versuchen jedoch tatsächlich, _ transaction_status mit 19 Zeichen zu speichern. Deshalb sind Sie in diesem Code auf diese Art von Fehlern gestoßen

7
jaideep
BEGIN TRY
    INSERT INTO YourTable (col1, col2) VALUES (@val1, @val2)
END TRY
BEGIN CATCH
    --print or insert into error log or return param or etc...
    PRINT '@val1='+ISNULL(CONVERT(varchar,@val1),'')
    PRINT '@val2='+ISNULL(CONVERT(varchar,@val2),'')
END CATCH
3
KM.

Im Allgemeinen fügen Sie einen Wert ein, der größer als der maximal zulässige Wert ist. Beispielsweise kann die Datenspalte nur bis zu 200 Zeichen enthalten, aber Sie fügen eine Zeichenfolge mit 201 Zeichen ein

3
ismail baig
  1. Rufen Sie die Abfrage ab, die die Probleme verursacht (Sie können auch SQL Profiler verwenden, wenn Sie nicht über die Quelle verfügen).
  2. Entfernen Sie alle WHERE-Klauseln und andere unwichtige Teile, bis Sie die SELECT- und FROM-Teile verlassen
  3. Hinzufügen von WHERE 0 = 1 (dadurch wird nur die Tabellenstruktur ausgewählt)
  4. Fügen Sie INTO [MyTempTable] direkt vor der FROM-Klausel hinzu

Sie sollten mit etwas wie enden 

SELECT
 Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
  [Tables etc.]
WHERE 0 = 1

Dadurch wird in Ihrer Datenbank eine Tabelle namens MyTempTable erstellt, die Sie mit Ihrer Zieltabellenstruktur vergleichen können, d. H. Sie können die Spalten in beiden Tabellen vergleichen, um zu sehen, wo sie sich unterscheiden. Es ist ein bisschen ein Workaround, aber es ist die schnellste Methode, die ich gefunden habe. 

2
profMamba

Es hängt davon ab, wie Sie die Einfüge-Aufrufe durchführen. Alles als ein Anruf oder als Einzelgespräch innerhalb einer Transaktion? Wenn einzelne Anrufe, dann ja (wenn Sie die Aufrufe durchlaufen, fangen Sie den fehlgeschlagenen Anruf ein). Wenn ein großer Anruf, dann nein. SQL verarbeitet die gesamte Anweisung und ist daher nicht in den Händen des Codes.

2
CodeMonkey1313

Es kann auch sein, dass Sie versuchen, einen null-Wert wieder in die Datenbank zu übernehmen. Eine Ihrer Transaktionen könnte also Nullen enthalten.

0
Fandango68

Bei den meisten Antworten handelt es sich um die offensichtliche Prüfung, dass die in der Datenbank definierte Länge der Spalte nicht kleiner als die Daten ist, die Sie in die Datenbank eingeben möchten.

Mehrere Male bin ich gebissen worden, als ich zu SQL Management Studio gegangen bin und folgendes gemacht habe:

sp_help 'mytable'

und seien Sie ein paar Minuten verwirrt, bis mir klar wird, dass die betreffende Spalte eine nvarchar ist. Dies bedeutet, dass die von sp_help gemeldete Länge wirklich doppelt so groß ist wie die tatsächlich unterstützte Länge, da es sich um einen Doppelbyte-Datentyp (Unicode) handelt.

wenn sp_help nvarchar Length 40 meldet, können Sie maximal 20 Zeichen speichern.

0
Chris Amelinckx

Mit Linq To SQL habe ich ein Debugging durchgeführt, indem ich den Kontext protokollierte, z. Context.Log = Console.Out Dann überprüfte SQL auf offensichtliche Fehler. Es gab zwei:

-- @p46: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value1]
-- @p8: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value2]

das letzte, was ich beim Durchsuchen des Tabellenschemas mit den Werten gefunden habe, war nvarchar (20), aber der Wert betrug 22 Zeichen

-- @p41: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [1234567890123456789012]

0
sdjfhueryeiur

In unserem eigenen Fall erhöhe ich die zulässige Zeichen- oder Feldgröße der SQL-Tabelle, die geringer ist als die Gesamtzahl der vom Front-End veröffentlichten Zeichen. Daher ist das Problem gelöst.

0