2012-02-02 6 views
0

を使用してSQL Server上に(大型の)オブジェクトを格納しますが、これは実際には行えませんしたい。私は、シリアライズとストア(ディスクからファイルへの読み込みだけでなく)に固有のいくつかの記事を見つけようとしており、これを最も効率的に行う方法もあります。私がまだ見つけていない "隠された"ベストプラクティスの記事がありますか?または、誰かがこれを行う方法の良い例がありますか?オブジェクトDataObjectはFILESTREAMを使用してSQL Serverテーブルに格納されなければならないSqlFileStreamを使用してSQL Serverに大きなオブジェクトをシリアル化して格納します

追加された例コード:

私の主な供給源はUsing SqlFileStream with C# to Access SQL Server FILESTREAM Data

編集です。私はそれがデータベースに私のオブジェクトをストリーミングすることができるだろうと思うが、私は現在、最良の方法でこれを行う方法を知らない、それをストリーミングするオブジェクトに何をする必要があり、非常に複雑な構造を持つ> 1 GB以上である必要があります。

新編集: 私は< 300キロバイトを非常に小さなデータを含むデータ構造とそれをテストしてきたし、問題はありません。それはバッファーの問題または類似している場合、私は考えている?

using System; 
using System.Collections.Generic; 
using System.Text; 

using System.IO; 
using System.Transactions; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using System.Data; 

namespace QEStore 
{ 
    public class DataObject 
    { 
     private Dictionary<int, string> _values = new Dictionary<int, string>(); 
     private string _objName; 
    } 

    public class Store 
    { 
     private string _connStr = "Data Source=127.0.0.1;Integrated Security=True;Initial Catalog=my_data;"; 

     public void InsertObject(int id, DataObject data) 
     { 
      var insStmt = 
       @"insert into data (data_id) values (@dataID); 
        select data_value.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() from data where data_id = @dataID;"; 

      string serverPath; 
      byte[] serverTxn; 

      using (var ts = new TransactionScope()) 
      { 
       using (var conn = new SqlConnection(this._connStr)) 
       { 
        conn.Open(); 
        using (var cmd = new SqlCommand(insStmt, conn)) 
        { 
         cmd.Parameters.Add("@dataID", SqlDbType.Int).Value = id; 
         using (var reader = cmd.ExecuteReader()) 
         { 
          reader.Read(); 
          serverPath = reader.GetSqlString(0).Value; 
          serverTxn = reader.GetSqlBinary(1).Value; 
          reader.Close(); 
         } 
        } 
        using (var dest = new SqlFileStream(serverPath, serverTxn, FileAccess.Write)) 
        { 
         // How to write the DataObject to the database using SqlFileStream 
         // dest.Write(...); 
        } 
       } 
       ts.Complete(); 
      } 
     } 
    } 
} 

私は次のように、オブジェクトをシリアル化しようとしたが、「ハンドルが無効です」と言っIOExceptionエラーを取得しています

using (var dest = new SqlFileStream(serverPath, serverTxn, FileAccess.Write)) 
{ 
    var formatter = new BinaryFormatter(); 
    formatter.Serialize(dest, data); 
    dest.Close(); 
} 
+0

@AndrewBarber良い質問:)それは必ずしも必要ではありません、残っているだけで、シリアル化してディスクに保存することからです! – aweis

+0

私は今持っているものの簡単な例を追加しました! – aweis

+0

いいえ。今私達は1)あなたが何を期待しているのか、2)実際に何が起こっているのかを知る必要があります。 *あなたの実際の問題は何ですか?私たちにあなたのコードを読ませて、推測させないでください... –

答えて

0

私は問題を発見しました。問題は、ビルトイン・シリアライザが大きなデータ・オブジェクトを処理できず、代わりにprotobuf-netを使用していることでした。