Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL数据库的备份和恢复_C#_Sql Server 2005_Smo - Fatal编程技术网

C# SQL数据库的备份和恢复

C# SQL数据库的备份和恢复,c#,sql-server-2005,smo,C#,Sql Server 2005,Smo,我需要(使用C#)将SQL 2005数据库备份到*.bak文件。我正试图从该文件恢复到同一台服务器上的新数据库中 备份工作正常,然后我的C#代码调用restore方法,它似乎一直工作到最后“超时”。我检查了“innerExceptions”,结果显示恢复成功率达到90%,然后返回异常 下面是我用来备份和恢复的代码 有人能告诉我哪里出了问题吗?它必须是一个超时参数的地方,我可以设置,但我不知道它是什么或如何做 public class JRBackupRestoreDB { public

我需要(使用C#)将SQL 2005数据库备份到*.bak文件。我正试图从该文件恢复到同一台服务器上的新数据库中

备份工作正常,然后我的C#代码调用restore方法,它似乎一直工作到最后“超时”。我检查了“innerExceptions”,结果显示恢复成功率达到90%,然后返回异常

下面是我用来备份和恢复的代码

有人能告诉我哪里出了问题吗?它必须是一个超时参数的地方,我可以设置,但我不知道它是什么或如何做

public class JRBackupRestoreDB
{
    public static void BackupDatabase(String databaseName, String userName, String password, String serverName, String destinationPath)
    {
        Backup sqlBackup = new Backup();

        sqlBackup.Action = BackupActionType.Database;
        sqlBackup.BackupSetDescription = "ArchiveDataBase:" + DateTime.Now.ToShortDateString();
        sqlBackup.BackupSetName = "Archive";

        sqlBackup.Database = databaseName;

        BackupDeviceItem deviceItem = new BackupDeviceItem(destinationPath, DeviceType.File);
        ServerConnection connection = new ServerConnection(serverName, userName, password);
        Server sqlServer = new Server(connection);

        Database db = sqlServer.Databases[databaseName];

        sqlBackup.Initialize = true;
        sqlBackup.Checksum = true;
        sqlBackup.ContinueAfterError = true;

        sqlBackup.Devices.Add(deviceItem);
        sqlBackup.Incremental = false;

        sqlBackup.ExpirationDate = DateTime.Now.AddDays(3);
        sqlBackup.LogTruncation = BackupTruncateLogType.Truncate;

        sqlBackup.FormatMedia = false;

        sqlBackup.SqlBackup(sqlServer);
    }

    public static void RestoreDatabase(String databaseName, String filePath,
    String serverName, String userName, String password,
    String dataFilePath, String logFilePath)
    {
        Restore sqlRestore = new Restore();

        BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File);
        sqlRestore.Devices.Add(deviceItem);
        sqlRestore.Database = databaseName;

        ServerConnection connection = new ServerConnection(serverName, userName, password);
        Server sqlServer = new Server(connection);

        Database db = sqlServer.Databases[databaseName];
        sqlRestore.Action = RestoreActionType.Database;
        String dataFileLocation = dataFilePath + databaseName + ".mdf";
        String logFileLocation = logFilePath + databaseName + "_Log.ldf";
        db = sqlServer.Databases[databaseName];
        RelocateFile rf = new RelocateFile(databaseName, dataFileLocation);

        System.Data.DataTable logicalRestoreFiles = sqlRestore.ReadFileList(sqlServer);
        sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFileLocation));
        sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFileLocation));

        sqlRestore.SqlRestore(sqlServer);
        db = sqlServer.Databases[databaseName];
        db.SetOnline();
        sqlServer.Refresh();
    }

}

您是否尝试过使用
ServerConnection.StatementTimeout设置一个值以查看发生了什么


MSDN参考。

这在普通sql中非常容易做到

你考虑过那样做吗?您只需要编写sql脚本或过程来完成它,然后运行它。这就是我们所做的(针对不同但相似的情况):


如果您正试图还原到同一服务器上的数据库中,您可以为此创建一个存储过程,传递mdf和ldf路径。存储过程在性能方面会更高效吗?我正在尝试StatementTimeout连接。这需要一些时间。说到这里。。。Chris提到的存储过程在这个场景中会表现得更好吗?也非常有用。因为我使用我的C类工作,所以仅仅调用一个存储过程是否会提高性能?@dellbingham我会用另一种方式问这个问题——将SQL命令抽象到C代码中有什么好处?在我工作/咨询过的每一家商店中,应用程序代码都充当调用存储过程的管道,而不是替代T-SQL和DDL。@dellbingham找出哪个性能更好的最好方法是两种方法都尝试一下。(这不是一个完美的测量方法,但
系统诊断。秒表
是一个很棒的工具)。如果有用的话+1它;)
backup database {{DATABASE NAME HERE}}
to disk = N'{{FILE_NAME_HERE}}'
    with
        name = N'{{BACKUP_DATABASE_NAME_HERE}}'
GO

restore database {{NEW_DATABASE_NAME}}
from disk = N'{{FILE_NAME_HERE}}'
    with
        file = 1
go