数据库问题,用SQL server 2012 附加 SQL server 2000 的数据库文件,出现如下提示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库问题,用SQL server 2012 附加 SQL server 2000 的数据库文件,出现如下提示相关的知识,希望对你有一定的参考价值。

标题: Microsoft SQL Server Management Studio
------------------------------

无法为该请求检索数据。 (Microsoft.SqlServer.Management.Sdk.Sfc)

------------------------------
其他信息:

执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)

------------------------------

C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\renyuan.mdf 不是主数据库文件。 (Microsoft SQL Server,错误: 5171)

参考技术A 不知道SQL server 2012 兼不兼容SQL server 2000的,但是SQL server 2005/2008 是兼容 SQL server 2000的,建议你使用SQL server 2005/2008来附加SQL server 2000数据库。 参考技术B SQL server 2012 是不兼容SQL server 2000的。追问

那SQL 2008 和 SQL 2005 了,有没有一个兼容软件啊

参考技术C 应该是不兼容的

在 C# 中附加 SQL Server 数据库

【中文标题】在 C# 中附加 SQL Server 数据库【英文标题】:Attach SQL Server database in C# 【发布时间】:2016-09-01 07:02:07 【问题描述】:

我正在用 C# 开发一个项目。我想使用 SMO 从 C# 代码中分离然后附加 SQL Server 数据库。我可以分离数据库,但是当我想附加它时,出现错误:

无法打开物理文件“C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale.mdf”。操作系统错误 5:“5(拒绝访问。)”。

代码:

OpenFileDialog f = new OpenFileDialog();
f.Title = "sqlbakcup";
f.FileName = "";
f.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files(*.*) |*.*";

if (f.ShowDialog() == DialogResult.OK)

    SqlConnection sqlconn = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True");
    ServerConnection serverconn = new ServerConnection(sqlconn);

    Server s = new Server(serverconn);
    s.DetachDatabase("ghale", false);

    //MessageBox.Show("ok");
    SqlConnection sqlconn1 = new SqlConnection(@"Data Source=.;Initial Catalog=mydb2;Integrated Security=True");

    SqlCommand sqlcmd = new SqlCommand("ALTER DATABASE mydb2  SET SINGLE_USER with ROLLBACK IMMEDIATE " + "use master  " + "RESTORE DATABASE [mydb2] FROM  DISK = @n WITH REPLACE ", sqlconn1);
    sqlcmd.Parameters.AddWithValue("@n", f.FileName);

    sqlconn1.Open();
    sqlcmd.ExecuteNonQuery();
    sqlconn1.Close();

    SqlConnection sqlconn2 = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True");
    ServerConnection serverconn2 = new ServerConnection(sqlconn2);

    Server s1 = new Server(serverconn2);
    s1.AttachDatabase("ghale", new StringCollection 
            @"C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale.mdf",
            @"C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale_log.ldf" , AttachOptions.None);
    //MessageBox.Show("ok");
    MessageBox.Show("OK");

【问题讨论】:

您的帖子中的 smo 是什么? @RBT: SQL Server 的共享管理对象 - 用于管理服务器及其数据库对象的库 SMO 代表 SQL Server 管理对象 好的。请发布您为附加数据库文件而编写的 SMO 的 C# 代码 How to attach sqlserver database in C#的可能重复 【参考方案1】:

几个观察:

    变量sqlconn2serverconn2s1是不必要的,因为您可以重复使用变量s重新附加ghale数据库 如果我注释掉将备份文件恢复到 mydb2 的中间部分,则重新附加 ghale 数据库将起作用 我怀疑您正在将ghale 备份文件恢复到数据库mydb2,如果是这样,请查看数据库属性| mydb2 的文件你会看到它正在使用文件ghale.mdfghale_log.ldf。因此,您无法重新附加 ghale.mdf,因为该文件现在正被数据库 mydb2 使用,因此出现 Access Denied 错误消息。

更新: 我认为以下代码是您想要完成的:

OpenFileDialog f = new OpenFileDialog();
f.Title = "sqlbakcup";
f.FileName = "";
f.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files(*.*) |*.*";

if (f.ShowDialog() == DialogResult.OK)

    using (SqlConnection sqlconn = new SqlConnection(@"Data Source=.;Initial Catalog=master;Integrated Security=True"))
    
        ServerConnection serverconn = new ServerConnection(sqlconn);

        Server s = new Server(serverconn);
        s.DetachDatabase("ghale", false);

        SqlConnection sqlconn1 = new SqlConnection(@"Data Source=.;Initial Catalog=mydb2;Integrated Security=True");

        SqlCommand sqlcmd = new SqlCommand(
            "ALTER DATABASE [mydb2] SET SINGLE_USER with ROLLBACK IMMEDIATE use master " 
            + @"RESTORE DATABASE [mydb2] FROM DISK = @n WITH REPLACE, "
            + @"MOVE 'ghale'     TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Data\mydb2.mdf', "
            + @"MOVE 'ghale_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Data\mydb2_log.ldf' "
            + @"ALTER DATABASE [mydb2] MODIFY FILE (NAME=N'ghale', NEWNAME=N'mydb2')"
            + @"ALTER DATABASE [mydb2] MODIFY FILE (NAME=N'ghale_log', NEWNAME=N'mydb2_log')",
        sqlconn1);
        sqlcmd.Parameters.AddWithValue("@n", f.FileName);

        sqlconn1.Open();
        sqlcmd.ExecuteNonQuery();
        sqlconn1.Close();

        s.AttachDatabase("ghale",
                        new StringCollection 
        @"C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale.mdf",
        @"C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\ghale_log.ldf" ,
                        AttachOptions.None);
    

我已更新 mydb2 数据库恢复 sql 以使用不同的物理文件存储数据和日志,并重命名逻辑名称。

【讨论】:

【参考方案2】:

试试这个..

首先要找到你的sqlserver服务账号,在任务管理器中同时按ctrl+alt+delete可以看到;然后,你必须赋予“C:\”的读/写权限Murach\SQL Server 2008\Databases”到服务帐户。

【讨论】:

C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA ...然后右键单击您的数据库 -> 属性 -> 安全选项卡 -> 继续 -> 选择完全控制用户

以上是关于数据库问题,用SQL server 2012 附加 SQL server 2000 的数据库文件,出现如下提示的主要内容,如果未能解决你的问题,请参考以下文章

sql server2012加载以前的原有数据库的时候出现了附加错误,怎么办

SQLServer2012不能用2008建的数据库。

SQL server 2008 r2附加数据库出现错误了,见下图,怎么解决?求帮助!!!!!

sql server附加数据库时出现错误提示:错误:9004 处理数据库的日志时出错

sql server 2008 日志文件删除后怎么附加

我想要把sql serve2000的mdf ldf文件升级到能在sql2012中用 求大神帮忙转换