利用 Excel/Access 內建 VBA + ADO,透過 MyODBC 驅動將 SQL Server 7.0 資料遷移至 MySQL。零成本、視覺化、適合中小量資料一次性遷移或定期同步。
mysql1)、伺服器、資料庫、帳密
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 或略過,勿手動指定 |
Application.OnTime 定時觸發LAST_MODIFIED 時間戳增量抓取 (WHERE modified > ?)
3. 衝突解決:以 PK 為準、來源端勝、或人工介入
VBA + ADO + MyODBC 是**零授權成本、開發門檻低、可視化除錯**的異質資料庫遷移利器,適合 < 100 萬筆、非即時同步場景。大量/高併發/即時需求請改用 CDC (Change Data Capture) + Kafka/Debezium 或專業 ETL 工具 (SSIS, Talend, DataX)。