1

我正在尝试制作一个能够从 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();

谢谢!

4

1 回答 1

1

我不熟悉Backup您在这里使用的对象(我总是发出实际BACKUP DATABASE命令),但我怀疑如果文件不存在与文件夹不存在与您不存在,您会得到不同的错误有权写入该文件夹。

该文件是否存在,以及您是否已指定.Initialize(相当于WITH INIT),将决定该命令在这种情况下的行为方式。

如果该文件夹不存在,您将收到错误消息,您需要先创建该文件夹(实际上是整个路径)。

如果该文件夹确实存在,您需要确保 SQL Server 服务帐户有权写入该文件夹。您试图写入根目录 ( C:\) - 驱动器根目录是现代 Windows 版本中特殊的、受保护的圣地。尝试创建一个类似的文件夹C:\backups\并备份到该位置。

这就是为什么我们通常允许 SQL Server 写入实例的指定备份文件夹或其他一些预先确定的位置 - 然后如果我们需要在其他地方移动/复制文件,则从那里移动/复制文件。我们通常不希望管理用户可能输入的任何文件夹的权限。

于 2012-09-27T00:39:00.013 回答