将 DataTable 存储在 SQL 的 Varbinary 列中,并将 Varbinary 检索回 DataTable
Store DataTable in a Varbinary column in SQL and retrieve Varbinary back into DataTable
我有一个包含处理所需的所有信息的数据表。我打算将它转换成一个byte[]数组,并存储在SQL.
中的一个Varbinary列中
这是我的代码,但我不知道如何将它直接转换为字节,因为我使用了数据集:
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);
}
How do I store a DataTable into a Varbinary column in SQL Server and retrieve it from SQL back into a DataTable?
这里有两个不同的问题:
- 如何获得
DataTable
to/from BLOB
- 如何从 SQL 服务器
store/fetch BLOB
IMO 它们应该分开存放。
第一个相对简单 - 它可以比使用 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[]
to/from SQL-Server,它在 Dapper 中工作只是通过...传递一个 byte[]
作为参数,或将其作为列读出。
但是请注意,将 DataTable
存储在 SQL table 的列中听起来有点... "inner platform".
我有一个包含处理所需的所有信息的数据表。我打算将它转换成一个byte[]数组,并存储在SQL.
中的一个Varbinary列中这是我的代码,但我不知道如何将它直接转换为字节,因为我使用了数据集:
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);
}
How do I store a DataTable into a Varbinary column in SQL Server and retrieve it from SQL back into a DataTable?
这里有两个不同的问题:
- 如何获得
DataTable
to/from BLOB - 如何从 SQL 服务器 store/fetch BLOB
IMO 它们应该分开存放。
第一个相对简单 - 它可以比使用 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[]
to/from SQL-Server,它在 Dapper 中工作只是通过...传递一个 byte[]
作为参数,或将其作为列读出。
但是请注意,将 DataTable
存储在 SQL table 的列中听起来有点... "inner platform".