2016-05-26 49 views
2

このプロジェクトでは、ExecuteDataReader,ExecuteScalarなどのような共通データアクセス用のADO.NETをラップするクラスがあります。 C#からSQL Serverストアドプロシージャにbyte []を渡してvarbinary(MAX)に変換する方法

ストアドプロシージャを呼び出すために、これらの方法を使用して、それはあなたがパラメータのDictionary<string, string>次いでSqlParameterとしてSqlCommandオブジェクトに追加される(文字列キー、文字列値)、通過させます。

データベースに文書を保存する必要がある場合があります。文書はbyte[]であり、データベースの対応する列はvarbinary(MAX)です。

解決策を探しましたが、利用可能なのはSqlDbType.Varbinaryを使用した例です。この状況ではオプションではありません。

私たちの最新の試みは、バイナリ文字列にbyte[]を変換しようnvarchar(max)としてストアドプロシージャにそれを渡し、Documentテーブルに保存するときにCONVERT(varbinary(max), @theFileBinaryString)を使用していた、しかし、これは、破損したファイルが保存されます。

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

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

答えて

1

C#

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

SQLはPARAMATERSを使用して、テーブルに直接のparamaterとして

例えば SQLをバイト配列を渡すためにあなたのクエリを更新します。

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

感謝を。残念ながら、SqlCommandオブジェクトを完全に制御することはできず、ファイルをnvarchar(max)として渡す必要があります。 – thiag0

2

は、あなたがこのSPがあるとします。バイト配列にファイルを変換し、直接、varbinary型のデータとしてバイト配列を挿入する

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

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

使用この構文:

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(); 
} 

リファレンス:http://www.codeproject.com/Questions/309795/How-to-insert-byte-array-into-SQL-table

このソリューションが役立ちます。

+0

ご返信ありがとうございます。私たちが呼び出しているSPは、ドキュメントコンテンツをnvarchar(max)として受け付けるユーザ定義のテーブルパラメータを受け入れます。これをSPにnvarchar(max)として渡す正しい方法を見つける必要があるため、SP内でvarbinary(max)に変換できます。 – thiag0

0

VARBINARY(MAX)byte[]の間に正しくマップされているSqlDbTypeはありません。パラメータ化インフラストラクチャは、あなたのためだけにこれを処理するためしかし、実際には、OKで、次のコードはうまく動作します:

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

は、詳細はこちらをご覧ください:ご返信用 What SqlDbType maps to varBinary(max)?

+0

ご返信ありがとうございます。残念ながら、このシナリオでは、ドキュメントコンテンツをnvarchar(max)として渡してからSP内で変換する必要があるため、これはうまくいきません。 – thiag0

+0

しかし、なぜですか? NVARCHARに変換してから変換すると意味がありません。ストアドプロシージャのパラメータは間違っていて、変更する必要があります。 – briantyler

関連する問題