【问题标题】:SqlBackup from my client app我的客户端应用程序中的 SqlBackup
【发布时间】:2010-03-26 16:06:16
【问题描述】:

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

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

var bdi = new BackupDeviceItem(backupFile, DeviceType.File); var 备份 = 新备份 { 数据库 = "AppDb", 初始化 = 真 };

backup.Devices.Add(bdi);

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

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

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

(为什么?因为用户可能在“备份位置”框中输入了网络位置,立即将SQL备份到网络位置失败。所以需要先写入本地,然后再复制到网络。)

上面的方法有替代方法吗?

【问题讨论】:

    标签: c# .net sql


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,但这不是我要找的。我的用户不理解“共享文件夹”,而且他们中有太多人无法自己手动完成。所以我希望这个解决方案对用户非常友好。
    • 用户不必共享文件夹。您必须在进行备份的远程 sql 服务器上执行此操作。然后,您的应用程序会将备份文件从该共享文件夹复制到用户本地计算机。
    • 远程SQL服务器也是客户端的一台机器。超出我的控制范围。
    【解决方案2】:

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

    代码如下。

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

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 1970-01-01
      • 2017-05-20
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多