首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Access/Excel 遷移 MySQL 實戰 (三):VB6 + ADO + Excel Object Library 自動化導入工具開發

     編輯:MySQL 資料庫相關知識

工程架構

  • **語言**:Visual Basic 6.0 (經典桌面開發,文中 2003 年背景)
  • **數據訪問**:ADO 2.6 (Microsoft ActiveX Data Objects 2.6 Library) — 同 ASP 經典模型
  • **Excel 操作**:Microsoft Excel 9.0 Object Library — 讀取 .xls 工作表
  • **UI 組件**:Common Dialog 6.0 (文件選擇)、Common Controls 6.0 (進度條/狀態欄)

核心對象聲明

Option Explicit
Dim Cn As New ADODB.Connection       ' Access/Excel 連接
Dim CnMySQL As New ADODB.Connection  ' MySQL 連接
Dim Rs As New ADODB.Recordset        ' 源數據游標
Dim RsMySQL As New ADODB.Recordset   ' 目標游標 (少用,多用 Command 執行 INSERT)

關鍵輔助函數:SQL 轉義

Function replace_str(srcstr As String)
    srcstr = Replace(srcstr, "\", "\\")  ' 反斜杠轉義
    replace_str = Replace(srcstr, "'", "\'")  ' 單引號轉義
End Function

**注意**:VB6/ADO 參數化查詢 (Command.Parameters) 更安全,文中為教學演示用字符串拼接。

Form_Load:初始化 MySQL 連接

Private Sub Form_Load()
    prgBar1.Visible = False
    ' DSN=build,UID=root,PWD=空 (文中示例)
    CnMySQL.ConnectionString = "uid=root;pwd=;dsn=build"
    CnMySQL.Open
End Sub

界面控件映射 (文中圖示)

控件名稱類型用途
1mdbfilenameTextBoxAccess 文件路徑
2mdbpasswordTextBoxAccess 數據庫密碼
3xlsfilenameTextBoxExcel 文件路徑
4select_mdbfileCommandButton選擇 .mdb 文件
5importMDBCommandButton執行 Access 導入
6CommonDialog1CommonDialog文件選擇對話框
7select_xlsfileCommandButton選擇 .xls 文件
8importXLSCommandButton執行 Excel 導入
9CommonDialog2CommonDialog文件選擇對話框
10prgBar1ProgressBar導入進度顯示
11StatusBar1StatusBar (Style=1-sbrSimple)狀態文本:導入中/完成

遷移邏輯大綱 (文中後續章節)

  1. 用戶選擇 .mdb/.xls 文件 → 顯示路徑
  2. 點擊「導入」按鈕 → 打開源連接 (ADO Jet OLEDB / Excel OLEDB)
  3. 讀取源表記錄集 → 逐行/批次構造 INSERT SQL → MySQL 執行
  4. 進度條更新、狀態欄提示、錯誤捕獲繼續/停止
  5. 完成提示、關閉連接

現代化重寫建議 (VB6 已停止支援 2008 年)

層面VB6 方案現代替代 (.NET Core / Python / Node.js / Go)
語言VB6 (COM、32位、無 GC)C# / VB.NET / Python 3.11+ / Go 1.22+
數據訪問ADO (OLEDB/ODBC)Entity Framework Core / Dapper / SQLAlchemy / GORM
Excel 讀取Excel COM Interop (需裝 Office、極慢、不穩)EPPlus/ClosedXML (C#)、openpyxl/pandas (Python)、exceljs (Node) — **無需 Office**
MySQL 驅動MyODBC 3.51MySqlConnector (C#)、mysqlclient/PyMySQL (Python)、go-sql-driver/mysql (Go)
並行導入單線程、UI 凍結Task/ThreadPool/asyncio/goroutine + 批次提交 (1000-5000 行/批)
進度反饋ProgressBar/StatusBarSignalR/WebSocket/控制台進度條/TQDM
部署安裝包、DLL 地獄Docker 容器 / 單文件發布 / Serverless Function

核心遷移模式 (跨語言通用)

# Python 概念代碼
def migrate_access_to_mysql(mdb_path, mysql_dsn, table_map):
    # 1. 連接源 (pyodbc + Access ODBC)
    src = pyodbc.connect(f"DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={mdb_path};")
    # 2. 連接目標 (MySqlConnector)
    tgt = mysql.connector.connect(**mysql_dsn)
    # 3. 逐表遷移
    for src_tbl, tgt_tbl, col_map in table_map:
        cols = ', '.join(col_map.keys())
        placeholders = ', '.join(['%s'] * len(col_map))
        sql = f"INSERT INTO `{tgt_tbl}` ({cols}) VALUES ({placeholders})"
        # 4. 批次讀取 + 批次寫入
        batch = []
        for row in src.cursor().execute(f"SELECT {cols} FROM `{src_tbl}`"):
            batch.append(tuple(row[col] for col in col_map.keys()))
            if len(batch) >= 5000:
                tgt.cursor().executemany(sql, batch)
                tgt.commit()
                batch.clear()
        if batch:
            tgt.cursor().executemany(sql, batch)
            tgt.commit()
    src.close(); tgt.close()

結語

文中 VB6+ADO 方案在 2003 年是「桌面自動化遷移」的主流選擇,但**今天已屬技術考古**。現代遷移工具鏈:**無 COM 依賴、無 Office 安裝、批次參數化、並行流式、容器化部署、可觀測進度**。若維護舊系統必須用 VB6,請嚴格隔離運行環境 (XP/Win7 虛擬機、網絡隔離);新專案**直接上現代棧**,開發效率提升 10x+,穩定性質變。

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