2012-02-02 49 views
0

我正在玩SqlFileStream来将我的(大型)对象存储在SQL Server上(在varbinary(max)列中),但我无法真正做到这一点我要。我一直在试图找到一些专门用于序列化和存储的文章(不仅仅是从磁盘读取文件到存储)以及如何最有效地做到这一点。是否有一些“隐藏”的最佳实践文章,我还没有找到?或者有人有一个很好的例子来说明如何做到这一点?使用SqlFileStream在SQL Server中序列化并存储大型对象

我的主要来源是Using SqlFileStream with C# to Access SQL Server FILESTREAM Data

编辑:

添加实施例的代码,其中,所述对象DataObject必须使用FILESTREAM被存储在SQL Server表。我期望可以将我的对象流到数据库中,但我目前不知道如何以最佳方式进行处理,我需要如何对对象进行流式处理并记住对象可以> 1 GB,其中有非常复杂的结构。

新编辑: 我已经包含很少的数据< 300 KB的数据结构进行了测试,并没有问题。那么我在想如果它是一个缓冲区问题或类似?

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 2012-02-02 12:14:03

+0

我现在已经添加了一个简单的例子,我有! – aweis 2012-02-02 12:24:13

+0

好的;现在我们需要知道1)你期望什么和2)实际发生了什么。 *您的实际问题*?不要让我们读你的代码,并猜测... – 2012-02-02 12:27:16

回答

0

我发现这个问题。问题在于内置序列化程序无法处理大数据对象,使用protobuf-net而不是处理。

相关问题