を使用して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();
}
@AndrewBarber良い質問:)それは必ずしも必要ではありません、残っているだけで、シリアル化してディスクに保存することからです! – aweis
私は今持っているものの簡単な例を追加しました! – aweis
いいえ。今私達は1)あなたが何を期待しているのか、2)実際に何が起こっているのかを知る必要があります。 *あなたの実際の問題は何ですか?私たちにあなたのコードを読ませて、推測させないでください... –