我有一个在多台计算机上运行的客户端应用程序,并连接到单个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>
我有替代上述方法吗?
答案 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;
}