2010-03-24 5 views
0

J'ai une application cliente qui s'exécute sur plusieurs machines et qui se connecte à une seule base de données SQL. Sur l'application cliente, l'utilisateur a la possibilité d'utiliser une base de données SQL locale (CE) ou de se connecter à une base de données SQL distante. Il y a aussi une boîte où un emplacement de sauvegarde peut être défini.SqlBackup à partir de mon application client

Pour la sauvegarde de la base de données SQL distant J'utilise le code suivant:

var BDI = new BackupDeviceItem (BackupFile, DeviceType.File); var backup = new Sauvegarde { Base de données = "AppDb", Initialize = true };

backup.Devices.Add (bdi);

var serveur = nouveau Serveur (connexion); backup.SqlBackup (serveur);

Lors du développement de mon application, je n'étais pas au courant que le backupFile donné est écrit sur la machine sur laquelle le serveur SQL s'exécute! Et pas sur la machine client. Ce que je veux c'est "vider" toutes les données de ma base de données vers un fichier local .

(Pourquoi? Parce que les utilisateurs peuvent entrer un emplacement réseau dans la zone "emplacement de sauvegarde" et que la sauvegarde SQL est immédiatement échouée, il faut d'abord écrire en local, puis copier sur le réseau.

Y a-t-il une alternative à la méthode ci-dessus?

Répondre

0

Affectez un dossier à partir de votre serveur SQL Server et laissez toutes les sauvegardes de base de données de votre application y être écrites. Partagez ce dossier puis codez votre application pour copier la sauvegarde de la base de données de ce dossier partagé vers l'emplacement spécifié par votre utilisateur.

Vous souhaiterez peut-être supprimer le fichier de sauvegarde après la copie pour vous assurer que vous ne remplissez pas votre espace disque. En outre, les noms de fichiers de sauvegarde sur le serveur peuvent devoir être uniques ou aléatoires pour éviter les problèmes lorsque plusieurs clients effectuent une sauvegarde en même temps.

+0

Merci pour votre réponse, mais ce n'est pas ce que je cherche. Mes utilisateurs ne comprennent pas "partager un dossier" et il y en a trop pour le faire moi-même manuellement. Je veux donc que la solution soit extrêmement conviviale. –

+0

Les utilisateurs n'ont pas besoin de partager le dossier. Vous devez le faire sur le serveur SQL distant à partir duquel la sauvegarde est effectuée. Votre application copiera ensuite le fichier de sauvegarde de ce dossier partagé sur la machine locale des utilisateurs. – Darnell

+0

Le serveur SQL distant est également une machine côté client. En dehors de mon contrôle. –

0

Trouvé une solution. J'effectue une requête "Select * from" sur toutes les tables de ma base de données et place le résultat dans un DataSet. Le DataSet est ensuite sérialisé (binaire ou XML) dans un flux. Le flux est écrit sur le disque.

Le code suit.

private static List<Stream> GetDatabaseAsBinary(string[] tablesToBackup, string connectionString) 
{ 
    var connection = new OleDbConnection("Provider=SQLOLEDB; " + connectionString); 
    connection.Open(); 
    var streams = new List<Stream>(); 
    foreach (var tableName in tablesToBackup) { 
     streams.Add(GetTableAsBinary(tableName, connection)); 
    } 

    return streams; 
} 

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