在開發 C# 應用程式時,操作 SQL Server 資料庫是常見需求。雖然 SqlClient 是原生且效能最佳的選擇,但有時因專案限制或跨資料庫考量,必須使用 OleDb 來連接 SQL Server。本文將以模擬 ATM 系統更新帳戶餘額為例,詳細說明如何正確使用 OleDbCommand 執行 SQL 更新語句,並解決常見的連線與參數化問題。
ATM,資料表 account 欄位:card_id、account_owner、account_password、account_sum使用 OleDb 連接 SQL Server 時,Provider 必須指定正確。建議使用 SQLNCLI11 (SQL Server Native Client 11.0) 以獲得最佳相容性:
string connStr = "Provider=SQLNCLI11;Data Source=.;Initial Catalog=ATM;Integrated Security=SSPI;";
// 或使用 SQLOLEDB (較舊)
// string connStr = "Provider=SQLOLEDB;Data Source=.;Initial Catalog=ATM;Integrated Security=SSPI;";
注意:若使用 SQL Server 驗證,請將 Integrated Security=SSPI 改為 User ID=yourUser;Password=yourPass;。
切勿直接拼接 SQL 字串,務必使用參數化查詢防止 SQL Injection 並正確處理資料型別。
using System;
using System.Data.OleDb;
public class AtmService
{
private readonly string _connStr = "Provider=SQLNCLI11;Data Source=.;Initial Catalog=ATM;Integrated Security=SSPI;";
public bool UpdateBalance(string cardId, decimal newSum)
{
const string sql = "UPDATE account SET account_sum = @newSum WHERE card_id = @cardId";
using (var conn = new OleDbConnection(_connStr))
using (var cmd = new OleDbCommand(sql, conn))
{
// OleDb 參數順序必須與 SQL 中 @ 參數出現順序一致
cmd.Parameters.Add("@newSum", OleDbType.Currency).Value = newSum;
cmd.Parameters.Add("@cardId", OleDbType.VarChar, 20).Value = cardId;
try
{
conn.Open();
int rows = cmd.ExecuteNonQuery();
return rows > 0;
}
catch (OleDbException ex)
{
// 記錄錯誤日誌
Console.WriteLine($"資料庫錯誤: {ex.Message}");
return false;
}
}
}
}
確認目標機器已安裝 Microsoft OLE DB Driver for SQL Server 或對應版本的 Native Client。
OleDb 不支援命名參數綁定,參數新增順序必須與 SQL 語句中 @param 出現順序完全一致。
account_sum 若為 money/decimal,請使用 OleDbType.Currency;card_id 為字串請用 OleDbType.VarChar 並指定長度。
若專案無特殊跨資料庫需求,請直接使用 System.Data.SqlClient (或 .NET Core 後的 Microsoft.Data.SqlClient),效能更好、功能更完整、支援命名參數與非同步操作:
using (var conn = new SqlConnection("Server=.;Database=ATM;Integrated Security=true;"))
using (var cmd = new SqlCommand("UPDATE account SET account_sum = @newSum WHERE card_id = @cardId", conn))
{
cmd.Parameters.AddWithValue("@newSum", newSum);
cmd.Parameters.AddWithValue("@cardId", cardId);
conn.Open();
cmd.ExecuteNonQuery();
}
使用 OleDbCommand 操作 SQL Server 完全可行,關鍵在於:正確的 Provider、參數化查詢、參數順序與型別對應。建議新專案優先採用 SqlClient,僅在維護舊系統或需支援多種資料庫時才使用 OleDb。