C# 如何恢复多个对MDF和LDF文件使用相同命名方案的SQL Server数据库

C# 如何恢复多个对MDF和LDF文件使用相同命名方案的SQL Server数据库,c#,.net,sql-server,C#,.net,Sql Server,我有一段C代码,用于恢复SQL Server数据库。这很有效。问题是在另一个.bak文件上再次运行它。即使第二个备份具有不同的名称,它也需要写入与第一个备份相同的目录,并且对.mdf和.ldf文件具有相同的命名方案 我只是好奇是否有办法修改.mdf和.ldf文件的命名方案,或者是否有其他方法在初始SQL Server目录下创建子目录,以便将这些文件还原到 我当前收到的错误消息: 其他信息:无法覆盖XXXXXX.MDF文件。数据库xax正在使用它 我想我可以使用move语句,但我试图避免在某个地方

我有一段C代码,用于恢复SQL Server数据库。这很有效。问题是在另一个
.bak
文件上再次运行它。即使第二个备份具有不同的名称,它也需要写入与第一个备份相同的目录,并且对
.mdf
.ldf
文件具有相同的命名方案

我只是好奇是否有办法修改
.mdf
.ldf
文件的命名方案,或者是否有其他方法在初始SQL Server目录下创建子目录,以便将这些文件还原到

我当前收到的错误消息:

其他信息:无法覆盖XXXXXX.MDF文件。数据库xax正在使用它

我想我可以使用move语句,但我试图避免在某个地方需要硬编码或登录到配置中的所有目录值

string sql = "SELECT database_id FROM sys.databases WHERE Name = '"+yuy+"'";

SqlConnection con = new SqlConnection(@"" + singleconn.Replace(@"\\", @"\"));
SqlCommand command = new SqlCommand(sql, con);
con.Open();

object resultObj = command.ExecuteScalar();
con.Close();

if (resultObj == null)
{
    string sql2 = "Restore Database " + yuy + " FROM DISK = '" + @"\" + localdir.Replace(@"\\", @"\") + @"\" + FileName + "'";

    SqlCommand command2 = new SqlCommand(sql2, con);
    con.Open();
    command2.ExecuteNonQuery();
    con.Close();
    con.Dispose();

    File.Delete(@"\" + localdir.Replace(@"\\", @"\") + @"\" + FileName);
    MessageBox.Show("Database recovered successfully!");
}
else
{
    Random rnd = new Random();
    int card = rnd.Next(52);
    MessageBox.Show("There is already a database under this name; renaming the DB to " + yuy + card.ToString());

    string sql2 = "Restore Database " + yuy + card.ToString() + " FROM DISK = '" + @"\" + localdir.Replace(@"\\", @"\") + @"\" + FileName + "'";

    SqlCommand command2 = new SqlCommand(sql2, con);
    con.Open();
    command2.ExecuteNonQuery();
    con.Close();
    con.Dispose();

    File.Delete(@"\" + localdir.Replace(@"\\", @"\") + @"\" + FileName);
    MessageBox.Show("Database Recovered Successfully!");
}
多亏了scsimon,我才解决了大部分问题,因为现在我得到的关于错误的最后一件事是这个

其他信息:逻辑文件“XXXXXX.mdf”不是数据库“Databasename”的一部分。使用RESTORE FILELISTONLY可列出逻辑文件名

问题是我直接从Databasename属性中提取这个。 任何帮助都将不胜感激

我只是好奇是否有办法修改 .mdf和.ldf文件,或者如果要创建其他方法 初始SQL Server目录下的子目录,用于存储这些文件 恢复到

您可以按照您的建议,使用
RESTORE
命令重命名和/或移动数据文件。看起来是这样的:

RESTORE DATABASE myDatabase FROM DISK = '\\somedir\someSubDir\mybackup.bak'
WITH
MOVE 'datafile1' TO 'E:\somedir\new_datafile2.mdf',
MOVE 'logfile'   TO 'E\somedir\new_log.ldf'
创建此选项的目的是将文件从备份中的默认位置移动到另一个目录(您可以这样做),但也可以重命名它们。当然,你也会为你所有的
.ndf
做这件事

我试图避免需要所有硬编码的目录值 或者登录到某个配置中

不用担心,只需使用数据库即可查看备份内容,如名称、日期和其他有用信息。对于文件路径,您可以使用。这将阻止您硬编码它们。更多关于这个


我明天会实施,并让你知道这是否有效。谢谢你的回答。如果你遇到issuesok,请告诉我你打赌@DigitPlays,谢谢你的帮助。这将起作用,但是我必须同时指定文件路径和mdf/ldf文件名。有没有办法在不指定的情况下更改它@scsimonI还将包括更改MDF和LDF的逻辑名称以匹配物理名称:
ALTER DATABASE newDB MODIFY FILE(name=oldDB,NEWNAME=newDB)GO ALTER DATABASE newDB MODIFY FILE(name=oldDB_log,NEWNAME=newDB_log)GO
现在一切正常。我非常感谢你们。我献上我的长子以示感激。非常感谢scsimon和HardCode。给我指出正确的方向你们是我的英雄。
CREATE TABLE #DataFiles (LogicalName nvarchar(128)
                        ,PhysicalName nvarchar(260)
                        ,[Type] char(1)
                        ,FileGroupName nvarchar(128) null
                        ,Size numeric(20,0)
                        ,MaxSize numeric(20,0)
                        ,FileID bigint
                        ,CreateLSN numeric(25,0)
                        ,DropLSN numeric(25,0)
                        ,UniqueID uniqueidentifier
                        ,ReadOnlyLSN numeric(25,0) null
                        ,ReadWriteLSN numeric(25,0) null
                        ,BackupSizeInBytes bigint
                        ,SourceBlockSize int
                        ,FileGroupID int
                        ,LogGroupGUID uniqueidentifier null
                        ,DifferentialBaseLSN numeric(25,0) null
                        ,DifferentialBaseGUID uniqueidentifier null
                        ,IsReadOnly bit
                        ,IsPresent bit
                        ,TDEThumbprint varbinary(32) null
                        ,SnapshotURL nvarchar(360) null
                        )
INSERT INTO #DataFiles
EXEC('RESTORE FILELISTONLY FROM DISK = ''E:\DB Backups\YourBackup.bak''')

SELECT LogicalName, PhysicalName FROM #DataFiles

DROP TABLE #DataFiles