C#:将SQL Server数据库备份到新的.bak文件

时间:2012-09-27 00:17:48

标签: c# sql-server database windows-forms-designer

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

如果文件夹不存在,则会出现错误,您需要先创建文件夹(嗯,整个路径)。

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

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