Я играю с SqlFileStream
для хранения моих (больших) объектов на SQL Server (в столбце varbinary(max)
), но я не могу заставить его делать так, как я хочу.Я пытался найти некоторые статьи, относящиеся к сериализации и хранению (не только чтение файлов с диска на хранилище) и как сделать это наиболее эффективно.Есть ли какие-то «скрытые» статьи о лучших практиках, которые я просто еще не нашел?Или у кого-нибудь есть хороший пример того, как это сделать?
Мой основной источник - Использование SqlFileStream с C # для доступа к данным SQL Server FILESTREAM
Редактировать:
Добавлен пример кода, где объект DataObject
должен храниться в таблице SQL Server с использованием файлового потока.Я ожидаю, что можно было бы направить мой объект в базу данных, но в настоящее время я не знаю, как это сделать наилучшим образом, что мне нужно сделать с объектом для его потоковой передачи и иметь в виду, что объект можетбыть> 1 ГБ с очень сложными структурами.
Новое редактирование: Я проверил его со структурами данных, содержащими очень мало данных <300 КБ, и проблем нет.Тогда я думаю, если это проблема с буфером или подобное? </p>
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();
}