“数据库已经存在。选择不同的数据库名称。无法附加文件...”恢复c#win app数据库后出错

时间:2017-07-31 11:03:26

标签: c# sql-server database

我开发了一个使用数据库“OlgooDB.mdf”的C#win应用程序。

static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Database.SetInitializer(new MigrateDatabaseToLatestVersion<OlgooContext, Configuration>());

应用 - &GT;迁移 - &gt;配置:

internal sealed class Configuration : DbMigrationsConfiguration<App.Model.OlgooContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
        ContextKey = "App.Model.OlgooContext";

        string dataDirPath = Application.StartupPath + "\\Database";
        AppDomain.CurrentDomain.SetData("DataDirectory", dataDirPath);
    }

    protected override void Seed(App.Model.OlgooContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}

当连接字符串定义为:

<connectionStrings>
<clear/>
<add name="OlgooContext" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog = OlgooDB; Integrated Security=True; " providerName="System.Data.SqlClient"/> </connectionStrings>

我可以毫无问题地恢复数据库但是当我将连接字符串更改为:

 <connectionStrings>
<clear/>
<add name="OlgooContext" connectionString="Data Source =.\SQLExpress;AttachDbFilename=|DataDirectory|\OlgooDB.mdf; Database=OlgooDB; Integrated Security=True;" providerName="System.Data.SqlClient"/> </connectionStrings>

恢复后发生此错误:

  

system.data.sqlclient.sqlexception(0x80131904):数据库'c:\ program files \ microsoft sql server \ mssql10.sqlexpress \ mssql \ data \ OlgooDB.mdf'已经存在。选择不同的数据库名称。   无法将文件'D:... \ bin \ Debug \ Database \ OlgooDB.mdf'作为数据库'OlgooDB'附加...

恢复功能:

private void backgroundWorkerRestore_DoWork(object sender, DoWorkEventArgs e)
    {
        using (var context = new OlgooContext())
        {
            string command = "ALTER DATABASE OlgooDB SET OFFLINE WITH ROLLBACK IMMEDIATE " +
                                                    " RESTORE DATABASE OlgooDB FROM DISK='" + txtRestorePath.Text + "'WITH REPLACE " +
                                                    "ALTER DATABASE OlgooDB SET ONLINE";
            context.Database.CommandTimeout = 360;
            context.Database.ExecuteSqlCommand(System.Data.Entity.TransactionalBehavior.DoNotEnsureTransaction, command);
        }
    }

有谁知道如何修复此错误?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您对连接到Express instancelocaldb感到困惑。

您的第一个连接字符串可以连接到Express实例,OlgooDB数据库: connectionString="Data Source=.\SQLEXPRESS; Initial Catalog = OlgooDB; Integrated Security=True; " providerName="System.Data.SqlClient"

在这种情况下,数据库已经附加了,不需要再次附加它了,并且它不是RESTORE给你一个错误,而是你的第二个连接字符串:

"Data Source =.\SQLExpress;AttachDbFilename=|DataDirectory|\OlgooDB.mdf; Database=OlgooDB; Integrated Security=True;" providerName="System.Data.SqlClient"

在这里使用语法连接到localdb,其中没有附加.mdf,并且在连接到localdb时附加它<​​/ p>

当然,当您尝试CREAT DATABASE FOR ATTACH时,它会失败,因为数据库已经存在。

因此您的连接字符串N2是错误的:如果您使用localdb,则在使用之前附加.mdf。但是你使用的是一个永久附加的数据库,你不需要附加它