使用C# Detach和Attach 数据库

先上一个使用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还是可以正常使用的

转载于:https://www.cnblogs.com/iwteih/archive/2010/01/18/1650651.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`attach()` 和 `detach()` 都是 Laravel 中用于建立多对多关联关系的方法。 `attach()` 方法用于将一个或多个新的关联关系添加到中间表中。它接受一个参数,这个参数可以是一个 ID 或 ID 数组。如果你传递的是单个 ID,那么这个 ID 对应的模型就会被添加到中间表中。如果你传递的是一个数组,那么数组中的每个 ID 对应的模型都会被添加到中间表中。 `detach()` 方法用于从中间表中删除一个或多个关联关系。它接受一个参数,这个参数可以是一个 ID 或 ID 数组。如果你传递的是单个 ID,那么这个 ID 对应的模型就会被从中间表中删除。如果你传递的是一个数组,那么数组中的每个 ID 对应的模型都会被从中间表中删除。 下面是一个例子,假设我们有一个 `User` 模型和一个 `Role` 模型,它们之间是多对多的关系,我们可以使用 `attach()` 方法将一个新的关联关系添加到中间表中,使用 `detach()` 方法从中间表中删除一个关联关系: ```php // 获取一个用户 $user = User::find(1); // 使用 attach() 方法添加一个新的角色 $user->roles()->attach(1); // 使用 detach() 方法删除一个现有的角色 $user->roles()->detach(2); ``` 在上面的例子中,我们首先获取了一个 ID 为 1 的用户,然后使用 `attach()` 方法将一个新的角色(ID 为 1)添加到这个用户的角色关联中。接着,我们使用 `detach()` 方法将用户的角色关联中 ID 为 2 的角色从中间表中删除。 希望这个例子能够帮助你理解 `attach()` 和 `detach()` 方法的使用。如果你还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值