关于attach和detach的疑问

本文解释了attach和detach在C++与WINDOWS对象关联中的作用。attach建立C++对象与WINDOWS对象之间的映射,若未使用detach解除关联,在C++对象销毁时,WINDOWS对象也将被销毁。文章还介绍了两种映射表——永久映射表与临时映射表的区别及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

            attach是把一个C++对象与一个WINDOWS对象关联,直到用detach则把关联去掉。   
 如果attach了以后没有detach,则C++对象销毁的时候WINDOWS对象跟着一起完蛋。  
           attach了以后,C++对象的指针和WINDOWS对象的HWND会有一个映射关系,其作用相当于你直接用一个C++对象去Create一个WINDOWS对象,例如   CEdit   edit;   edit.create(...)   ,并且此映射是永久的,直到此对象完蛋为止。  
           如果用类似GetDlgItem函数也可以返回一个指针,并可以强制转换。GetDlgItem会到映射表里找。  
            有2种映射表,一中是永久的,一种是临时的。  
            直接用C++对象创建的WINDOWS对象或者是通过attach的对象的映射关系都被放到永久表中,否则就在临时表中创建映射.所以GetDlgItem不推荐你保存返回的指针,因为你很难保证你的WINDOWS对象跟C++对象的关联是否放在永久表中。  
              如果映射是放在临时表中,那么在空闲时间会被自动删除。  
              用attcah完全是为了方便用MFC类的成员函数去操纵WINDOWS对象。  
  如果还对这个不明白的话,请看《由GetDlgItem函数想到的》一文  
<think>嗯,用户想了解分离附加法备份还原法在数据库管理中的具体实施步骤应用场景。首先,我需要确认这两个方法的定义它们在数据库中的作用。分离附加法通常指的是将数据库文件(如SQL Server的.mdf.ldf文件)从当前服务器实例中分离,然后附加到另一个实例或同一实例的不同位置。备份还原则是创建数据库的备份文件,并在需要时恢复数据库。 接下来,具体步骤。分离附加法的步骤可能包括:1. 确保数据库没有活动连接,可能需要断开用户或设置为单用户模式。2. 使用SQL命令或图形界面执行分离操作。3. 移动或复制文件到目标位置。4. 在目标服务器上附加数据库文件。需要注意权限问题文件路径是否正确。 备份还原法的步骤大致是:1. 执行完整备份生成.bak文件。2. 需要还原时,使用备份文件覆盖现有数据库或恢复到特定时间点。可能需要使用RESTORE命令,处理事务日志备份等。应用场景方面,分离附加适用于迁移或快速复制数据库,而备份还原用于灾难恢复或版本回退。 还要考虑用户可能的疑问,比如两种方法的优缺点。分离附加更快,但不记录事务,风险较高;备份更安全,但耗时。应用场景举例,比如开发环境迁移用分离附加,生产环境用备份还原。 可能需要检查是否有遗漏步骤,例如分离前是否备份,附加时的权限问题,备份策略(完整、差异、日志备份)等。同时,确保使用正确的术语,比如SQL Server中的Detach/AttachBackup/Restore,避免混淆其他数据库系统的类似功能。 最后,生成相关问题时要围绕实施细节、对比、注意事项应用实例,帮助用户深入理解。</think>### 分离附加法与备份还原法的实施步骤 #### 一、分离附加法 **实施步骤**: 1. **分离数据库** - 确保数据库无活动连接(可通过`ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE`强制断开连接)[^1] - 执行分离命令: ```sql EXEC sp_detach_db '数据库名', 'true'; ``` - 分离后,数据库文件(如`.mdf``.ldf`)可自由移动或复制。 2. **附加数据库** - 将文件复制到目标服务器路径。 - 执行附加命令: ```sql CREATE DATABASE [数据库名] ON (FILENAME = '路径\数据文件.mdf'), (FILENAME = '路径\日志文件.ldf') FOR ATTACH; ``` **应用场景**: - 快速迁移数据库到同版本服务器。 - 直接操作物理文件进行备份或测试环境搭建[^2]。 --- #### 二、备份还原法 **实施步骤**: 1. **完整备份** ```sql BACKUP DATABASE [数据库名] TO DISK = '路径\备份文件.bak' WITH INIT; ``` 2. **还原数据库** - 覆盖现有数据库(需独占访问权限): ```sql RESTORE DATABASE [数据库名] FROM DISK = '路径\备份文件.bak' WITH REPLACE; ``` - 还原到新数据库: ```sql RESTORE DATABASE [新数据库名] FROM DISK = '路径\备份文件.bak' WITH MOVE '原数据文件逻辑名' TO '新路径\数据文件.mdf', MOVE '原日志文件逻辑名' TO '新路径\日志文件.ldf'; ``` **应用场景**: - 灾难恢复(如数据误删、硬件故障)。 - 版本回退或跨服务器版本迁移(需注意兼容性)[^3]。 --- #### 三、方法对比 | **特性** | **分离附加法** | **备份还原法** | |----------------|--------------------------|--------------------------| | **速度** | 快(直接操作文件) | 较慢(需读写备份文件) | | **事务安全性** | 低(分离时可能丢失连接) | 高(支持时间点恢复) | | **适用场景** | 同版本迁移、临时测试 | 灾难恢复、跨版本迁移 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值