19 Stimmen

Welcher SqlDbType wird auf varBinary(max) abgebildet?

Welcher SqlDbType wird auf varBinary(max) abgebildet? SqlDbType.VarBinary sagt, dass es auf 8K begrenzt ist. Die SQL Server-Dokumentation besagt, dass varbinary(max) ca. 2 GB speichern kann. 2GB. Aber SqlDbType.VarBinary sagt, dass es auf 8K begrenzt ist.

30voto

Remus Rusanu Punkte 280155

SqlDbType.VarBinary mit der Länge -1 ist das Äquivalent zu VARBINARY(MAX), zumindest theoretisch. Das Problem ist jedoch etwas komplexer, da es auch einen Typ (nicht einen Enum-Wert) gibt, nämlich SqlTypes.SqlBytes die verwendet werden können. Und es gibt SqlTypes.SqlFileStream die auch verwendet werden können für VARBINARY(MAX) Typen, wenn sie die FILESTREAM Attribut.

Das Problem ist jedoch, dass keine dieser Enums oder Typen das eigentliche Problem bei der Arbeit mit VARBINARY(MAX) Spalten in ADO.Net: Speicherverbrauch. Alle diese Typen, wenn sie "out-of-the-box" verwendet werden, erstellen Kopien des Wertes, die als einzelnes Array im Speicher zugewiesen werden, was bestenfalls unperformant ist, aber wenn der Inhalt größer wird, wird die Verwendung aufgrund von Zuweisungsfehlern schlichtweg unmöglich. Ich habe einige Artikel, die zeigen, wie man richtig damit umgeht VARBINARY(MAX) Werte in ADO.Net unter Verwendung einer Streaming-Semantik, die die Erstellung von In-Memory-Kopien des gesamten Inhalts vermeidet:

0 Stimmen

Es ist wirklich seltsam, dass dies bei mir nicht funktioniert hat. Ich musste schreiben: dtProducts.Columns.Add(new DataColumn("Cover", typeof(byte[])) { AllowDBNull = true }); beachten Sie die byte[]...das ist, was bei mir funktionierte.

0 Stimmen

Ich habe das zuerst falsch verstanden. Der erste Satz sollte lauten "mit einer Länge von -1". Hat mein Problem nicht gelöst, aber gut zu wissen. Außerdem gibt es jetzt einen SqlType für varbinary (2022): SqlDbType.VarBinary.

7voto

dmg Punkte 580

Versuchen Sie dies:

SqlParameter blobParam = new SqlParameter("@blob", SqlDbType.VarBinary, buffer.Length);
blobParam.Value = buffer;
cmd.Parameters.Add(blobParam);

Mal sehen, ob das funktioniert

1 Stimmen

Wie lautete die Lösung, nur so aus Neugierde?

1 Stimmen

Was ist die Art der buffer ?

0 Stimmen

@JohnSaunders Obwohl ich nicht der Autor bin, bin ich bei der Arbeit mit SqlGeometry auf einen Puffer gestoßen. Sie können SqlBytes aus dem SqlGeometry-Typ erhalten, so dass in meinem Fall die vorangehenden Zeilen etwa so lauten würden: System.Data.SqlTypes.SqlBytes sqlBytes = sqlGeo.STAsBinary(); byte[] buffer = sqlBytes.Buffer;

0voto

Brian MacKay Punkte 29566

Das könnte helfen: http://msdn.microsoft.com/en-us/library/a1904w6t.aspx

So hässlich es auch sein mag, SqlDbType.Image scheint der richtige Weg zu sein. Sieht aus wie ich meine ORM aktualisieren müssen, da alles über 8k es derzeit brechen würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X