我正在尝试制作一个能够从SQL Server备份和还原数据库的Windows窗体应用程序。用户可以选择保存.bak文件的位置。
我遇到的问题是,如果该文件尚不存在,则不会创建新文件。因此,如果我在SQL Server中进行备份并将其保存到C:\ backup.bak并将其作为“路径”传递给程序,如果我将文件的位置或名称更改为不存在它会抛出错误,说它无法打开备份设备。是否有可能让它创建一个新的.bak文件,如果它不存在,我将如何去做呢?
我的代码目前如下;
var dataSource = txtDS.Text;
var db = txtDbName.Text;
var path = txtBackup.Text;
var name = txtName.Text;
var desc = txtDesc.Text;
if(File.Exists( path) == true )
{
MessageBox.Show("Test");
}
else
{
Directory.CreateDirectory(@path);
}
Server myServer = new Server(dataSource);
myServer.ConnectionContext.LoginSecure = true;
myServer.ConnectionContext.Connect();
var bkpDbLog = new Backup();
bkpDbLog.Action = BackupActionType.Database;
bkpDbLog.Database = db;
bkpDbLog.Devices.AddDevice(path, DeviceType.File);
bkpDbLog.BackupSetName = name;
bkpDbLog.BackupSetDescription = desc;
bkpDbLog.Initialize = true;
bkpDbLog.Checksum = true;
bkpDbLog.ContinueAfterError = true;
bkpDbLog.Incremental = false;
bkpDbLog.FormatMedia = false;
bkpDbLog.PercentComplete += CompletionStatusInPercent;
bkpDbLog.Complete += BackupCompleted;
bkpDbLog.SqlBackup(myServer);
if (myServer.ConnectionContext.IsOpen)
myServer.ConnectionContext.Disconnect();
谢谢!
答案 0 :(得分:1)
我不熟悉你在这里使用的Backup
对象(我总是发出实际的BACKUP DATABASE
命令)但我怀疑如果文件不存在,你会得到不同的错误如果文件夹不存在,则表示您没有写入文件夹的权限。
文件是否存在,以及您是否指定了.Initialize
(相当于WITH INIT
),将决定该命令在该情况下的行为。
如果文件夹不存在,则会出现错误,您需要先创建文件夹(嗯,整个路径)。
如果 文件夹存在,则需要确保SQL Server服务帐户具有写入该文件夹的权限。您试图写入根(C:\
) - 在现代版本的Windows中,驱动根是特殊的,受保护的圣地。尝试创建C:\backups\
之类的文件夹并备份到该位置。
这就是为什么我们通常允许SQL Server写入实例的指定备份文件夹或其他一些预先确定的位置 - 然后如果我们在其他地方需要它,则从那里移动/复制文件。我们通常不希望管理用户可能输入的任何文件夹的权限。