【问题标题】:C#: Backup SQL Server Database to a NEW .bak fileC#:将 SQL Server 数据库备份到新的 .bak 文件
【发布时间】:2012-09-27 08:39:00
【问题描述】:

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

谢谢!

【问题讨论】:

  • 我尝试直接保存到 C:\,但仍然报错。我按照这个指南technico.qnownow.com/…截图i.imgur.com/jUqSb.jpg
  • 谢谢!那行得通,这是权限。愚蠢的错误:)
  • 没问题,很高兴我能这么快提供帮助。

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


【解决方案1】:

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

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

如果文件夹不存在,你会得到一个错误,你需要先创建文件夹(嗯,整个路径,真的)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多