首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 使用 OleDbCommand 操作 SQL Server 資料庫完整教學:以 ATM 系統更新餘額為例

     編輯:程式設計綜合問答

前言

在開發 C# 應用程式時,操作 SQL Server 資料庫是常見需求。雖然 SqlClient 是原生且效能最佳的選擇,但有時因專案限制或跨資料庫考量,必須使用 OleDb 來連接 SQL Server。本文將以模擬 ATM 系統更新帳戶餘額為例,詳細說明如何正確使用 OleDbCommand 執行 SQL 更新語句,並解決常見的連線與參數化問題。

環境與前置準備

  • Visual Studio 2013 / .NET Framework 4.5+
  • SQL Server 2012 (或更新版本)
  • 資料庫 ATM,資料表 account 欄位:card_id、account_owner、account_password、account_sum
  • 已安裝 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 或 SQL Server Native Client

連線字串設定關鍵

使用 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;。

核心程式碼:使用 OleDbCommand 執行參數化更新

切勿直接拼接 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;
            }
        }
    }
}

常見錯誤與解決方案

1. 「找不到提供者」錯誤

確認目標機器已安裝 Microsoft OLE DB Driver for SQL Server 或對應版本的 Native Client。

2. 參數順序錯誤

OleDb 不支援命名參數綁定,參數新增順序必須與 SQL 語句中 @param 出現順序完全一致。

3. 資料型別不符

account_sum 若為 money/decimal,請使用 OleDbType.Currency;card_id 為字串請用 OleDbType.VarChar 並指定長度。

替代方案:使用 SqlClient (強烈建議)

若專案無特殊跨資料庫需求,請直接使用 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。

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