先上一个使用SQL 语句进行Detach和Attach数据库的语句:
use master go sp_detach_db 'TestDB' go use master go sp_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 here Server 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; GO sp_detach_db Archive; GO -- Get the SQL Server data path DECLARE @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 statement EXEC ('CREATE DATABASE Archive ON (FILENAME = '''+ @data_path + 'archdat1.mdf'') FOR ATTACH'); GO
不过目前在SQL Server 2008中sp_attach_db还是可以正常使用的