2010-07-12 5 views
1

J'ai écrit le contenu d'une table dans ma base de données sur le disque en utilisant la fonction suivante.Sérialiser/désérialiser DataSet (comme un moyen de sauvegarder mes données)

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;   
} 

Le but de cette fonction est de faire une sauvegarde de la table.

Maintenant, je veux faire l'inverse: lire la table dans une base de données (vide). J'ai cherché et essayé quelques choses, mais je n'ai toujours pas réussi. Avant de me dire qu'il existe d'autres façons de faire une sauvegarde: Quelques dizaines de clients sauvegardent déjà leur base de données en utilisant la méthode ci-dessus, j'ai donc besoin d'une fonction inverse. Et ne me dites pas que ce n'est pas possible :)

+0

Arrêtons de parler de « sauvegardes "Http://www.joelonsoftware.com/items/2009/12/14.html – Andomar

+0

Merci, vous me rendre nerveux :) –

Répondre

2

BinaryFormatter a Deserialize fonction.

+0

Oui, j'ai vu ça. Mais alors quoi: ai-je besoin de OleDbDataAdapter pour récupérer les données? –

+0

De cause, si vous voulez remettre toutes les données en DB. –

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; 
} 
utilisation

:

DataSet ds = DeSerializeObject<DataSet>(stream); 

Pour la partie OleDbAdapter un coup d'oeil à http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx et http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.aspx - vous finiriez avec quelque chose comme ceci:

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); 
Questions connexes