使用C# Detach和Attach 数据库

来源:互联网 发布:淘宝自定义模块尺寸 编辑:程序博客网 时间:2024/06/06 19:09

先上一个使用SQL 语句进行Detach和Attach数据库的语句:

use mastergosp_detach_db 'TestDB'go                                                                                                                use mastergosp_attach_db '1','C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestDB.mdf','C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestDB_log.ldf'go

用C#进行Detach和Attach数据库,我想到的有两种方法

1. 用SqlCommand执行上述语句,代码如下:
using(SqlConnectionsc =newSqlConnection(txtConntionString.Text))
{
  
using(SqlCommandcmd =newSqlCommand(@"use master;
            exec sp_detach_db 'TestDB'"
, sc))
    {
       
if(sc.State ==ConnectionState.Closed)
             sc.Open();

         cmd.CommandType =
CommandType.Text;
         cmd.ExecuteNonQuery();
    }
}

using(SqlConnectionsc =newSqlConnection(txtConntionString.Text))
{
  
using (SqlCommandcmd =newSqlCommand(@"use master;
                         exec sp_attach_db 'TestDB'
                         ,'C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestDB.mdf'
                         ,'C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestDB_log.ldf'"
, sc))
   {
       
if(sc.State ==ConnectionState.Closed)
            sc.Open();

        cmd.CommandType =
CommandType.Text;
        cmd.ExecuteNonQuery();
   }
}

需要注意的是SQL语句中的go在这里换成了分号,SQL语句中不加exec也可以正常执行,而这里必须加入exec
因为用到了SqlConnection,所以必须指定一个有效的连接字串,在Detach时可以用TestDB这个数据库作连接字串,但是在Attach时,就不用TestDB了,因为还未创建,这点在写代码时要注意,当然如果连接字串中使用的是master数据库,那use master也可以省了

2. 使用SQL Server自带的Attach和Detach功能
这里有用到SQL Server提供的几个Dll
先加引用:
Microsoft.SqlServer.ConnectionInfo
Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo
命名空间加:
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using System.Collections.Specialized;

代码如下:
ServerConnection sc = new ServerConnection("ServerNameHere");//You can specify username and password here
Server server = newServer(sc);
server.DetachDatabase(
"TestDB",false);

ServerConnection sc = new ServerConnection("ServerNameHere");//You can specify username and password hereServer server = new Server(sc);
StringCollection files = new StringCollection();files.Add(@"C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestDB.mdf");files.Add(@"C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestDB_log.ldf");server .AttachDatabase("TestDB", files, AttachOptions.None);

在执行完后可以调用Server的Disconnect方法关闭连接。

在detach和attach数据库时有一些选项,可以根据需要自己指定。

 

更新:

查看SQL Server帮助文档得知 sp_attach_db在今后可能弃用,建议使用create database,示例如下:

USE master;GOsp_detach_db Archive;GO-- Get the SQL Server data pathDECLARE @data_path nvarchar(256);SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)                  FROM master.sys.master_files                  WHERE database_id = 1 AND file_id = 1);-- Execute CREATE DATABASE FOR ATTACH statementEXEC ('CREATE DATABASE Archive      ON (FILENAME = '''+ @data_path + 'archdat1.mdf'')      FOR ATTACH');GO

 

不过目前在SQL Server 2008中sp_attach_db还是可以正常使用的

原创粉丝点击