2016-05-26 11 views
2

In diesem Projekt gibt es eine Klasse, die ADO.NET für gemeinsamen Datenzugriff wie ExecuteDataReader, ExecuteScalar, etc Wraps.Wie übergeben Sie Byte [] von C# als Zeichenfolge an SQL Server gespeicherte Prozedur und konvertieren in Varbinary (MAX)

Wenn diese Verfahren unter Verwendung einer gespeicherten Prozedur aufzurufen, ermöglicht es Ihnen eine Dictionary<string, string> von Parametern (String key, String-Wert), der als SqlParameter zum SqlCommand Objekt hinzugefügt werden dann zu übergeben.

Es gibt einen Fall, in dem wir ein Dokument in der Datenbank speichern müssen. Das Dokument ist ein byte[] und die entsprechende Spalte in der Datenbank ist varbinary(MAX).

Wir haben uns nach einer Lösung umgeschaut, aber es gibt nur Beispiele, die SqlDbType.Varbinary verwenden, was in dieser Situation keine Option ist.

Unsere neueste Versuch, um zu versuchen, war die byte[] in eine binäre Zeichenfolge zu konvertieren, übergeben sie in die gespeicherte Prozedur als nvarchar(max) und dann CONVERT(varbinary(max), @theFileBinaryString) zu verwenden, wenn es um die Document Tabelle zu speichern, jedoch spart dies eine beschädigte Datei.

C#

byte[] pDocumentBytes = ...; 
string documentAsBinary = "0x" + BitConverter.ToString(pDocumentBytes).Replace("-", ""); 

SQL

@DocumentContentAsBinary nvarchar(max) -- This is "documentAsBinary" from C# above 

DECLARE @DocumentContentVarbinary varbinary(max); 
SET @DocumentContentVarbinary = CONVERT(varbinary(max), @DocumentContentAsBinary); 

Antwort

1

Aktualisieren Sie Ihre Abfrage Paramater zu verwenden und das Byte-Array als Parameter um direkt an den Tisch

zB SQL-Pass:

insert into table values (@data); 

C#

SqlComman com = new SqlCommand("insert into table values (@data);",Database Connection); 
com.Paramaters.Add(new SqlParameter("@Data" Byte array)); 
com.executeNonQuery(); 
+0

Vielen Dank für Ihre Antwort. Leider haben wir nicht die volle Kontrolle über das SqlCommand-Objekt und müssen die Datei als nvarchar (max) übergeben. – thiag0

2

Angenommen, Sie dieses SP haben:

DECLARE 
@Value1 ... 
@Value2 ... 
... 
@File VARBINARY(MAX) 

INSERT INTO [YourTable] (Column1, Column2, ..., File) VALUES (@Value1, @Value2, ..., @File) 

Verwenden Sie diese Syntax, um die Datei zu Byte-Array zu konvertieren und direkt Byte-Array als varbinary Daten einfügen:

using System.Data.SqlClient; 
using System.IO; 

byte[] data; 

using (FileStream fs = new FileStream(document, FileMode.Open) 
{ 
    BinaryReader fileReader = new BinaryReader(document); 
    data = fileReader.ReadBytes((int)document.Length); 
    document.Close(); // don't forget to close file stream 
} 

using (var connection = new SqlConnection("YourConnectionStringHere")) 
{ 
    connection.Open(); 
    using (var command = new SqlCommand("YourSPHere", connection) 
    { 
     command.CommandType = CommandType.StoredProcedure; 

     // insert parameters here 

     // add file parameter at the end of collection parameters 
     command.Parameters.AddWithValue("@File", SqlDbType.VarBinary).Value = data; 
     command.ExecuteNonQuery(); 
    } 
    connection.Close(); 
} 

Referenz : http://www.codeproject.com/Questions/309795/How-to-insert-byte-array-into-SQL-table

Ich hoffe diese Lösung nützlich.

+0

Danke für Ihre Antwort. Der SP, den wir aufrufen, akzeptiert einen benutzerdefinierten Tabellenparameter, der nur den Dokumentinhalt als nvarchar (max) akzeptiert. Wir müssen den richtigen Weg finden, um dies als nvarchar (max) an den SP zu übergeben, damit es innerhalb des SP in varbinary (max) konvertiert werden kann. – thiag0

0

Es gibt keine SqlDbType, die ordnungsgemäß zwischen VARBINARY(MAX) und byte[] abbildet. Aber eigentlich, dass in Ordnung ist, weil die Parametrisierung Infrastruktur nur diese Griffe für Sie, den folgenden Code funktioniert nur:

var binary = new bytes[1]; 
var command = new SqlCommand("INSERT INTO [MyTable]([BinaryColumn]) VALUES (@binary)"); 
command.Parameters.AddWithValue("@binary", binary); 
command.ExecuteNonQuery(); 

Sehen Sie hier für weitere Informationen: What SqlDbType maps to varBinary(max)?

+0

Danke für Ihre Antwort.Leider wird dies in diesem Szenario nicht funktionieren, da wir den Dokumentinhalt als nvarchar (max) übergeben und dann innerhalb des SP konvertieren müssen. – thiag0

+0

Aber warum? Die Konvertierung in einen NVARCHAR und die anschließende Konvertierung ist sinnlos. Die Parameter Ihrer gespeicherten Prozedur sind einfach falsch und müssen geändert werden. – briantyler

Verwandte Themen