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

SQL Server 7.0 資料遷移至 MySQL 實戰:VBA + ADO + MyODBC 完整範例

     編輯:關於SqlServer

利用 Excel/Access 內建 VBA + ADO,透過 MyODBC 驅動將 SQL Server 7.0 資料遷移至 MySQL。零成本、視覺化、適合中小量資料一次性遷移或定期同步。

前置準備

  1. 下載安裝 MyODBC (現稱 Connector/ODBC) 官網
  2. ODBC 管理員 → 系統 DSN → 新增 → MySQL ODBC Driver → 設定 DSN 名稱 (如 mysql1)、伺服器、資料庫、帳密
  3. Excel/Access 開啟 VBE (Alt+F11) → 參考設定 → 勾選 Microsoft ActiveX Data Objects 2.x Library

完整 VBA 遷移碼


Sub MigrateSQLServerToMySQL()
    Dim cnSQL As New ADODB.Connection, cnMySQL As New ADODB.Connection
    Dim rs As New ADODB.Recordset, cmd As New ADODB.Command
    Dim sql As String, i As Long

    ' 1. 連接 MySQL (透過 MyODBC DSN)
    cnMySQL.Open "DSN=mysql1"

    ' 2. 連接 SQL Server 7.0 (OLEDB)
    cnSQL.Open "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=123456;Initial Catalog=softdown;Data Source=ntserver"

    ' 3. 可選:建立 MySQL 目標表 (僅首次執行)
    ' sql = "CREATE TABLE softinfo (softNum SMALLINT, softname VARCHAR(70), softdesc BLOB, ...)"
    ' cmd.ActiveConnection = cnMySQL: cmd.CommandText = sql: cmd.Execute

    ' 4. 讀取 SQL Server 資料
    sql = "SELECT * FROM softinfo ORDER BY softnum"
    rs.Open sql, cnSQL, adOpenForwardOnly, adLockReadOnly

    ' 5. 逐筆寫入 MySQL (參數化防注入、處理特殊字元)
    Do Until rs.EOF
        sql = "INSERT INTO softinfo (softNum, softname, softdesc, softPath, softLeng, softClass, softSugest, softDown) " & _
              "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
        cmd.ActiveConnection = cnMySQL
        cmd.CommandText = sql
        cmd.CommandType = adCmdText
        ' 依順序 Append 參數 (型別、長度對應 MySQL 定義)
        cmd.Parameters.Append cmd.CreateParameter("p1", adSmallInt, adParamInput, , rs("softNum").Value)
        cmd.Parameters.Append cmd.CreateParameter("p2", adVarChar, adParamInput, 70, rs("softname").Value)
        cmd.Parameters.Append cmd.CreateParameter("p3", adLongVarChar, adParamInput, , rs("softdesc").Value)
        cmd.Parameters.Append cmd.CreateParameter("p4", adVarChar, adParamInput, 30, rs("softPath").Value)
        cmd.Parameters.Append cmd.CreateParameter("p5", adVarChar, adParamInput, 10, rs("softLeng").Value)
        cmd.Parameters.Append cmd.CreateParameter("p6", adVarChar, adParamInput, 10, rs("softClass").Value)
        cmd.Parameters.Append cmd.CreateParameter("p7", adTinyInt, adParamInput, , rs("softSugest").Value)
        cmd.Parameters.Append cmd.CreateParameter("p8", adInteger, adParamInput, , rs("softDown").Value)
        cmd.Execute
        ' 清除參數供下一筆
        cmd.Parameters.Delete cmd.Parameters.Count - 1  ' 簡化:重建 cmd 或迴圈清除
        rs.MoveNext
    Loop

    ' 6. 清理
    rs.Close: Set rs = Nothing
    cnMySQL.Close: Set cnMySQL = Nothing
    cnSQL.Close: Set cnSQL = Nothing
    MsgBox "遷移完成!"
End Sub

關鍵技術點

點說明
MyODBC 版本建議 5.3+ (Unicode 支援佳)、連線字串加 CHARSET=utf8mb4
大量資料效能關閉自動認可 cnMySQL.BeginTrans → 批次 1000 筆 CommitTrans,速度提升 10-50 倍
BLOB/TEXT 欄位用 adLongVarChar/adLongVarBinary + GetChunk/AppendChunk 分塊處理
錯誤處理加 On Error GoTo ErrHandler,記錄失敗 PK 至日誌表,支援斷點續傳
IDENTITY/自增MySQL AUTO_INCREMENT 欄位插入時傳 NULL 或略過,勿手動指定

進階:雙向同步 / 定時排程

  • Excel/Access 巨集設定 Application.OnTime 定時觸發
  • 2. 以 LAST_MODIFIED 時間戳增量抓取 (WHERE modified > ?) 3. 衝突解決:以 PK 為準、來源端勝、或人工介入

總結

VBA + ADO + MyODBC 是**零授權成本、開發門檻低、可視化除錯**的異質資料庫遷移利器,適合 < 100 萬筆、非即時同步場景。大量/高併發/即時需求請改用 CDC (Change Data Capture) + Kafka/Debezium 或專業 ETL 工具 (SSIS, Talend, DataX)。

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