【发布时间】:2020-03-27 21:48:16
【问题描述】:
我正在编写一个简单的 C# 应用程序,它允许用户通过选择数据库的路径并为数据库提供一个新名称来恢复数据库 - 我的问题是;
- 恢复功能仍在寻找生成备份的路径并失败
- 数据库备份包含 FILESTREAM 数据并且也失败了,因为我似乎也无法解释/或重新定位它。
代码 C#
Restore dbRestore = new Restore();
BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File);
dbRestore.Devices.Add(deviceItem);
dbRestore.Database = databaseName;
ServerConnection connection = new ServerConnection(serverName, userName, password);
Server sqlServer = new Server(connection);
Database db = sqlServer.Databases[databaseName];
dbRestore.Action = RestoreActionType.Database;
String dataFileLocation = dataFilePath + databaseName + ".mdf";
String logFileLocation = logFilePath + databaseName + "_Log.ldf";
db = sqlServer.Databases[databaseName];
DataTable dtFileList = dbRestore.ReadFileList(sqlServer);
string dbLogicalName = dtFileList.Rows[0][0].ToString();
string logLogicalName = dtFileList.Rows[1][0].ToString();
dbRestore.RelocateFiles.Add(new RelocateFile(dbLogicalName, dataFileLocation));
dbRestore.RelocateFiles.Add(new RelocateFile(logLogicalName + "_log", logFileLocation));
dbRestore.ReplaceDatabase = true;
dbRestore.dbRestore(sqlServer);
db = sqlServer.Databases[databaseName];
db.SetOnline();
sqlServer.Refresh();
}
catch (Exception ex)
{
Console.Write(ex.ToString());
MessageBox.Show(ex.Message, "This is exception for testing");
}
##error
抛出异常: 'Microsoft.SqlServer.Management.Smo.FailedOperationException' 在 Microsoft.SqlServer.SmoExtended.dll Microsoft.SqlServer.Management.Smo.FailedOperationException:恢复 服务器“SERVERNAME”失败。 ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException:一个 执行 Transact-SQL 语句或批处理时发生异常。 ---> System.Data.SqlClient.SqlException:逻辑文件“DatabaseDemo_4do6_EM_INDEXGROUP_log”不是数据库的一部分 '新数据库名称'。使用 RESTORE FILELISTONLY 列出逻辑文件 名字。 RESTORE DATABASE 异常终止。在 Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction 动作、对象 execObject、数据集 fillDataSet、布尔值 catchException) 在 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(字符串 sqlCommand, ExecutionTypes executionType, Boolean retry) --- End of 内部异常堆栈跟踪 --- 在 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(字符串 sqlCommand, ExecutionTypes executionType, Boolean retry) at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands, ExecutionTypes executionType, Boolean retry) at Microsoft.SqlServer.Management.Smo.BackupRestoreBase.ExecuteSql(服务器 服务器,StringCollection 查询)在 Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(服务器 srv)
--- 内部异常堆栈跟踪结束 --- 在 Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(Server srv) 程序“[14052] OPSAdmin.exe”已退出,代码为 -1 (0xffffffff)。
问题:
- 我怎样才能有效地做到这一点,同时还要考虑文件流数据
- 我的“RelocateFiles”功能有什么问题。
谢谢。!!
【问题讨论】:
-
dtFileList 中是否还有更多行?
-
@DavidBrowne-Microsoft - 好的,是的,dtFileList 中有更多行,当我重新定位它们时,恢复工作正常,但我的问题是如何动态处理这个问题,考虑到某些数据库可能有更多dtFileList 中的行数多于其他行?感谢您的意见。
标签: c# .net sql-server winforms