Сериализация и хранение больших объектов в SQL Server с использованием SqlFileStream - PullRequest
0 голосов
/ 02 февраля 2012

Я играю с 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();
}

1 Ответ

0 голосов
/ 06 февраля 2012

Я нашел проблему.Проблема заключалась в том, что встроенный сериализатор не мог обработать большой объект данных, вместо этого использовался protobuf-net .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...