在我的 c# 应用程序中,我有一个从.bak
文件还原数据库的函数,我适用于某些.bak
文件。 但对于一些不是。 这是我的代码和解释:
C# 代码:
void RestoreDatabase(String databaseName , String backUpFile , String serverName , String userName , String password)
{
ServerConnection connection = new ServerConnection(serverName , userName , password);
Server sqlServer = new Server(connection);
Restore rstDatabase = new Restore();
rstDatabase.Action = RestoreActionType.Database;
rstDatabase.Database = databaseName;
BackupDeviceItem bkpDevice = new BackupDeviceItem(backUpFile , DeviceType.File);
rstDatabase.Devices.Add(bkpDevice);
rstDatabase.ReplaceDatabase = true;
rstDatabase.SqlRestore(sqlServer);
}
这是我调用函数的方式:RestoreDatabase("myDb" , "D:\myFile.bak" , "10.0.0.1" , "myUserName" , "Admin123");
例外:
Microsoft.SqlServer.Management.Smo.FailedOperationException: 服务器"10.0.0.1"的还原失败。 ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException:执行 Transact-SQL 语句或批处理时发生异常。---> System.Data.SqlClient.SqlException:文件"D:\Database\v2014\Default\Rdb\UDB\GSWarehouse\GSWarehouse.mdf"的目录查找失败,操作系统错误 2(系统找不到指定的文件(。
文件"GSWarehouse"无法恢复为"D:\Database\v2014\Default\Rdb\UDB\GSWarehouse\GSWarehouse.mdf"。使用 WITH MOVE 标识文件的有效位置。
在规划 RESTORE 语句时发现了问题。以前的消息提供了详细信息。 还原数据库正在异常终止。 at Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException( at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionType executionType( ---内部异常堆栈跟踪结束--- at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionType executionType( at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommand, ExecutionType executionType( at Microsoft.SqlServer.Management.Smo.BackupRestoreBase.ExecuteSql(Server server, StringCollection query( at Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(Server srv( ---内部异常堆栈跟踪结束--- at Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(Server srv( at Lib.Mail.MailPage11.RestoreDatabase(字符串数据库名称、字符串备份文件、字符串服务器名称、字符串用户名、字符串密码(
注意:
如果我手动创建文件夹GSWarehouse
目录内D:Databasev2014DefaultRdbUDB
则执行消失了。
我的问题:我需要创建此文件夹的通用解决方案。
也许像这样:
if(!Directory.Exists(thePathFromTheExeption))
Directory.CreateDirectory(thePathFromTheExeption)
只需添加缺少的目录:
if(!Directory.Exists("D:Databasev2014DefaultRdbUDBGSWarehouse"))
Directory.CreateDirectory(thePathFromTheExeption)