Visual Studio 原生不支援 MySQL,需安裝 MySQL Connector/NET 才能在 VB.NET 專案中操作資料庫。本文以 VS 2022 / .NET 6 為例,完整示範從下載、引用、封裝資料存取類到實際呼叫的全流程。
Install-Package MySql.Data -Version 8.3.0MySql.Data 安裝。MySqlHelperImports MySql.Data.MySqlClient
Imports System.Data
Public Class MySqlHelper
Private ReadOnly _connStr As String
Public Sub New(connStr As String)
_connStr = connStr
End Sub
''' <summary>執行查詢,回傳 DataTable</summary>
Public Function ExecuteQuery(sql As String, ParamArray params As MySqlParameter()) As DataTable
Dim dt As New DataTable()
Using conn As New MySqlConnection(_connStr),
cmd As New MySqlCommand(sql, conn)
If params IsNot Nothing AndAlso params.Length > 0 Then
cmd.Parameters.AddRange(params)
End If
Using da As New MySqlDataAdapter(cmd)
da.Fill(dt)
End If
End Using
Return dt
End Function
''' <summary>執行非查詢(INSERT/UPDATE/DELETE),回傳影響列數</summary>
Public Function ExecuteNonQuery(sql As String, ParamArray params As MySqlParameter()) As Integer
Using conn As New MySqlConnection(_connStr),
cmd As New MySqlCommand(sql, conn)
If params IsNot Nothing AndAlso params.Length > 0 Then
cmd.Parameters.AddRange(params)
End If
conn.Open()
Return cmd.ExecuteNonQuery()
End Using
End Function
''' <summary>執行純量查詢(COUNT/MAX 等)</summary>
Public Function ExecuteScalar(Of T)(sql As String, ParamArray params As MySqlParameter()) As T
Using conn As New MySqlConnection(_connStr),
cmd As New MySqlCommand(sql, conn)
If params IsNot Nothing AndAlso params.Length > 0 Then
cmd.Parameters.AddRange(params)
End If
conn.Open()
Dim obj = cmd.ExecuteScalar()
If obj Is Nothing OrElse obj Is DBNull.Value Then Return Nothing
Return CType(obj, T)
End Using
End Function
End Class
Dim helper As New MySqlHelper("Server=127.0.0.1;Port=3306;Database=testdb;Uid=dev;Pwd=*****;SslMode=Preferred;")
' 查詢並繫結 GridView
Dim dt = helper.ExecuteQuery("SELECT id, name, email FROM users WHERE status=@status", New MySqlParameter("@status", 1))
GridView1.DataSource = dt
GridView1.DataBind()
' 參數化新增
Dim affected = helper.ExecuteNonQuery(
"INSERT INTO users(name, email, created_at) VALUES(@name, @email, NOW())",
New MySqlParameter("@name", "Alice"),
New MySqlParameter("@email", "alice@example.com")
)
Console.WriteLine($"新增 {affected} 筆")
' 純量查詢
Dim total = helper.ExecuteScalar(Of Long)("SELECT COUNT(*) FROM users WHERE status=@status", New MySqlParameter("@status", 1))
Console.WriteLine($"啟用使用者:{total} 位")
MySqlParameter 自動處理型別與跳脫。Pooling=true;Min Pool Size=5;Max Pool Size=100; 依負載調整。Connection/Command/DataAdapter 正確 Dispose,避免洩漏。ExecuteReaderAsync、ExecuteNonQueryAsync 提升吞吐。MySqlException,依 Number 區分 1062(重複鍵)、1213(死鎖)、2006(連線中斷) 等常見錯誤碼做重試或回滾。| 現象 | 原因 | 解決 |
|---|---|---|
| Unable to connect to any of the specified MySQL hosts | 防火牆/安全組阻擋 3306、bind-address 設為 127.0.0.1 | 開放埠、改 bind-address=0.0.0.0 或建立 SSH 隧道 |
| Authentication plugin 'caching_sha2_password' not supported | MySQL 8.0 預設新認證外掛,舊版 Connector 不支援 | 升級 Connector 8.0+,或建立用戶指定 IDENTIFIED WITH mysql_native_password |
| SSL connection error | 預設啟用 SSL,憑證驗證失敗 | 連線字串加 SslMode=Preferred 或 SslMode=None(僅內網) |
結語:掌握 Connector/NET 正確用法,封裝輕量 Helper 類,即可在 VB.NET 專案中安全、高效操作 MySQL。後續可延伸 Dapper/EF Core 等 ORM,進一步提升開發效率。