首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 資料遷移至 Access 兩步走:ADO Recordset 循環寫入實現

     編輯:關於SqlServer

場景描述

  • 來源:SQL Server 資料表
  • 目標:Access (.mdb/.accdb) 資料表,**結構完全一致**
  • 限制:Access 檔案與 SQL Server **不在同一台機器**,無法使用 OPENROWSET/OPENDATASOURCE 連結伺服器方式。
  • 欄位數較多 (數十個),手工逐欄位映射極其繁瑣。

解決方案:雙 Recordset 循環搬運 (C++/ATL/ADO 代碼示例)

核心邏輯:

  1. 開啟來源 Recordset (SQL Server,adOpenForwardOnly、adLockReadOnly,唯讀游標)。
  2. 開啟目標 Recordset (Access,adOpenStatic、adLockOptimistic,可更新游標)。
  3. 遍歷來源記錄,對每一記錄:
      a. 目標 AddNew()
      b. 循環遍歷 Fields 集合,按**序數索引** GetCollect(i) / PutCollect(i) 搬運值 (自動處理型別轉換、NULL)。
      c. 目標 Update() 提交。
  4. 來源 MoveNext() 直到 EOF。

核心代碼片段 (Visual C++ / ATL / ADO)

// 假設 m_pRecordset_sql (來源) 和 m_pRecordset_access (目標) 已成功 Open
_variant_t vValue;
while (!m_pRecordset_sql->adoEOF)
{
    m_pRecordset_access->AddNew();
    for (long i = 0; i < m_pRecordset_sql->Fields->Count; i++)
    {
        // 按序數獲取值 (自動處理型別、NULL)
        vValue = m_pRecordset_sql->GetCollect(_variant_t(i));
        // 按序數寫入值
        m_pRecordset_access->PutCollect(_variant_t(i), vValue);
    }
    m_pRecordset_access->Update();
    m_pRecordset_sql->MoveNext();
}

關鍵技術點解析

技術點說明
GetCollect / PutCollectADO 高效存取欄位值方法,**按序數 (0-based) 而非名稱**,避免名稱不匹配/大小寫問題,效能優於 Fields["Name"]->Value。
_variant_tATL 智慧型別包裝器,自動管理 VARIANT 參考計數與型別轉換 (SQL datetime ↔ Access Date 等)。
游標類型選擇來源 adOpenForwardOnly (單向唯讀,最輕量);目標 adOpenStatic / adOpenKeyset + adLockOptimistic (支援 AddNew/Update)。
批次提交優化大量資料 (萬行+) 建議每 100-500 行 UpdateBatch 或事務包裹,減少往返開銷。
異構型別映射ADO/OLEDB Provider 自動處理常見型別對應 (int↔Long, varchar↔Text, datetime↔Date, bit↔Yes/No)。特殊型別 (image/varbinary) 需分塊寫入。

替代方案對比

方案優點缺點適用場景
雙 Recordset 循環 (本文)通用、不需同機、代碼簡潔、自動型別映射逐行往返、大量資料慢 (需批次優化)中小表、異機、結構同、一次性/低頻
SSIS 封裝視覺化、高效能、錯誤處理、可排程部署複雜、學習曲線生產級 ETL、大量資料、定期同步
BCP OUT + Access 匯入極快、命令列自動化需中間檔案、型別映射手工處理大表、純資料、可容忍中間檔
Linked Server (OPENROWSET)單條 SQL 完成、T-SQL 原生**需同機/網路可達**、配置繁瑣、權限敏感同網域、頻繁跨庫查詢/寫入

完整流程建議 (生產級)

  1. Schema 比對:自動腳本比對來源/目標欄位名、型別、長度、可空性、預設值,**確保結構一致**。
  2. 資料清洗:來源端處理臟資料 (超長字串截斷、非法日期修正、NULL 處理)。
  3. 分批遷移:主鍵範圍/時間範圍分批,每批 5000-10000 行,記錄遷移日誌 (起止 PK、行數、耗時、錯誤)。
  4. 驗證核對:行數比對、關鍵欄位 CHECKSUM 聚合比對、抽樣人工複核。
  5. 回滾預案:目標表備份/快照,失敗可快速恢復。

總結

當 Access 與 SQL Server 異機且表結構一致時,**ADO 雙 Recordset 循環搬運** 是最輕量、通用的程式化方案。關鍵在於 GetCollect/PutCollect 按序數無感知搬運與游標類型正確選擇。大量資料場景務必加入**批次提交/事務控制/進度日誌**,並配合 SSIS/BCP 等重型工具評估選型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved