来自我的客户端应用程序的SqlBackup

时间:2010-03-24 09:18:52

标签: c# .net sql

我有一个在多台计算机上运行的客户端应用程序,并连接到单个SQL数据库。在客户端应用程序上,用户可以使用本地SQL(CE)数据库或连接到远程SQL数据库。还有一个可以设置备份位置的框。

对于远程SQL数据库的备份,我使用以下代码:

var bdi = new BackupDeviceItem(backupFile,DeviceType.File);  var backup = new Backup  {   Database =“AppDb”,   Initialize = true  };

backup.Devices.Add(BDI);

var server = new Server(连接);  backup.SqlBackup(服务器);

在开发我的应用程序时,我不知道给定的backupFile是在SQL服务器运行的机器上编写的!而不是在客户端机器上。

我想要的是将我的数据库中的所有数据“转储”到本地文件

(为什么?因为用户可能会在“备份位置”框中输入网络位置,并且立即将SQL备份到网络位置失败。因此,需要首先写入本地,然后在这种情况下复制到网络。)< / p>

我有替代上述方法吗?

2 个答案:

答案 0 :(得分:0)

从SQL Server分配一个文件夹,让您的应用程序中的所有数据库备份都写在那里。共享此文件夹,然后对应用程序进行编码,以将数据库备份从此共享文件夹复制到用户指定的位置。

您可能希望在复制后删除备份文件,以确保不填满磁盘空间。此外,服务器上的备份文件名可能需要是唯一的或随机的,以避免多个客户端同时进行备份时出现问题。

答案 1 :(得分:0)

找到解决方案。我对数据库中的所有表执行“Select * from”查询,并将结果放入DataSet中。然后将DataSet序列化(二进制或XML)到流。 Stream被写入磁盘。

代码如下。

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