序列化/反序列化DataSet(作为备份我的数据的一种方式)

时间:2010-07-12 09:30:42

标签: c# .net sql database dataset

我已使用以下函数将数据库中的表内容写入磁盘。

private static Stream GetTableAsBinary(string table, OleDbConnection oleDbConnection)
{
    var oleDbDataAdapter = new OleDbDataAdapter(string.Format("select * from {0}", table), oleDbConnection);
    var dataSet = new DataSet();
    oleDbDataAdapter.Fill(dataSet, table);
    dataSet.RemotingFormat = SerializationFormat.Binary;
    var format = new BinaryFormatter();
    var memStream = new MemoryStream();
    format.Serialize(memStream, dataSet);
    return memStream;          
}

此功能的目的是备份表格。

现在我想反过来:将表读回(空)数据库。我已经四处寻找并尝试了几件事,但仍然没有成功。

在你告诉我还有其他方法进行备份之前:有几十个客户已经使用上述方法备份了他们的数据库,所以我需要一个反向功能。不要告诉我这是不可能的:)

2 个答案:

答案 0 :(得分:2)

BinaryFormatter具有Deserialize功能。

答案 1 :(得分:1)

private static T DeserializeObject<T>(MemoryStream memory) where T : class // might need to check the constraint.
{
BinaryFormatter formatter = new BinaryFormatter();
return formatter.Deserialize(stream) as T;
}

用法:

DataSet ds = DeSerializeObject<DataSet>(stream);

对于OleDbAdapter部分,请查看http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspxhttp://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.aspx - 您最终得到的结果如下:

var oleDbAdapter = new OleDbAdapter("select * from...", table, oleDbConnection);
oleDbAdapter.InsertCommand = new OleDbCommand("insert into mytable values (?,?)");
oleDbAdapter.UpdateCommand = new OleDbCommand("update mytable values foo = ?, bar =? where mykey = ?");
oleDbAdapter.DeleteCommand = new OleDbCommand("delete from mytable where mykey = ?");

oleDbAdapater.InsertCommand.Paramaters.Add(...);
oleDbAdapater.UpdateCommand.Paramaters.Add(...);
oleDbAdapater.DeleteCommand.Paramaters.Add(...);

oleDbAdapater.Update(ds);