Сохраните DataTable в столбце Varbinary в SQL и извлеките Varbinary обратно в DataTable

У меня есть DataTable, содержащий всю информацию, необходимую для обработки. Я планирую преобразовать его в массив byte[] и сохранить в столбце Varbinary в SQL.

Вот мой код, но я не знаю, как напрямую преобразовать его в байты, так как я использую для него DataSet:

DataTable dt = new DataTable();
DataColumn dc1 = new DataColumn("Name");
DataColumn dc2 = new DataColumn("Age");
DataColumn dc3 = new DataColumn("Gender");

dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);

//adding of inner datatable to outer datatable
dt.Rows.Add("John", "23", "Male");
dt.Rows.Add("Gretchen", "25", "Female");
dt.Rows.Add("Jordan", "28", "Male");

DataSet ds = new DataSet();
ds.Tables.Add(dt);
string xmlString = ds.GetXml();

MemoryStream ms = new MemoryStream();
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlString);
xml.Save(ms);
byte[] xmlBytes = ms.ToArray();

Вот код, который я использую для хранения данных. Я использую Dapper при вызове хранимой процедуры:

using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Configuration.GetConnectionString("TEST_DB")))
            {
                var parameters = new DynamicParameters();
                parameters.Add("@Input_ByteData", xmlBytes);

                connection.Execute("dbo.uspInsertDataIntoVarbinaryColumn", parameters, commandType: CommandType.StoredProcedure);
            }

Как сохранить DataTable в столбце Varbinary в SQL Server и извлечь его из SQL обратно в DataTable?


person thecodeexplorer    schedule 17.07.2018    source источник
comment
Не могли бы вы показать нам, что вы вставили информацию в таблицу?   -  person D-Shih    schedule 17.07.2018
comment
Есть ли причина не просто вставлять данные в таблицу БД? Это делает его доступным для запросов, а ваш текущий подход - нет. В вашем примере данные полностью текстовые, есть ли причина для использования Varbinary? или XML в этом отношении?   -  person Alex K.    schedule 17.07.2018
comment
Добавлен код вставки таблицы.   -  person thecodeexplorer    schedule 17.07.2018
comment
Причина, по которой я воздержался от вставки данных в таблицу БД, заключается в том, что мне не нужно запрашивать содержимое DataTable из SQL. Я буду использовать эти данные только на C#, и я использую SQL для хранения этих данных, пока не придет время, когда они мне понадобятся. Так что это скорее хранение данных для будущего использования.   -  person thecodeexplorer    schedule 17.07.2018
comment
Как вы теперь, какие DataSet принадлежат этому пользователю? потому что нет ПК или ключа для поиска двоичного файла `DataSet`   -  person D-Shih    schedule 17.07.2018
comment
Мне не нужно хранить DataTable в DateSet, так как я буду использовать SQL только для хранения информации DataTable внутри одного столбца.   -  person thecodeexplorer    schedule 17.07.2018


Ответы (1)


Здесь есть две отдельные проблемы:

  1. как получить DataTable в/из BLOB
  2. как хранить/извлекать BLOB из SQL Server

ИМО они должны храниться отдельно.

Первый относительно прост — его можно сделать немного эффективнее, чем ваш код с использованием SerializationFormat.Binary, для которого требуется BinaryFormatter, но:

static DataTable FromBytes(byte[] arr)
{
    using (var ms = new MemoryStream(arr))
    {
        return (DataTable)new BinaryFormatter().Deserialize(ms);
    }
}
static byte[] ToBytes(DataTable table)
{
    using (var ms = new MemoryStream())
    {
        table.RemotingFormat = SerializationFormat.Binary;
        new BinaryFormatter().Serialize(ms, table);
        return ms.ToArray();
    }            
}

Затем все, что вам нужно сделать, это отправить byte[] в/из SQL-сервера, который работает в Dapper, просто... передав byte[] в качестве параметра или прочитав его как столбец.

Однако обратите внимание, что сохранение DataTable в столбце таблицы SQL звучит немного... "внутренняя платформа".

person Marc Gravell    schedule 17.07.2018
comment
Знаете ли вы о возможных проблемах, которые могут возникнуть из-за моего подхода к хранению DataTable в таблице SQL? Я не собираюсь делать ничего, связанного с SQL, с DataTable, например, делать запросы и т. д. Я буду использовать его в C# только после того, как преобразую его в DataTable. Поэтому я буквально просто сохраняю его в таблице SQL. - person thecodeexplorer; 17.07.2018
comment
@thecodeexplorer, с ним будет очень сложно работать, если вам позже понадобятся эти данные из node.js, Java или чего-то еще; кроме этого ... вы должны быть в порядке - person Marc Gravell; 17.07.2018
comment
О, я вижу. Потому что он в формате DataTable. Спасибо что подметил это. - person thecodeexplorer; 17.07.2018