首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 資料庫操作三大經典模式完整指南

     編輯:關於C#

在處理 C# 與 SQL Server 2005 的資料庫互動時,掌握核心操作模式是開發的基石。本文整理出三種最經典、最基礎的資料存取方式,並提供完整可執行的程式碼範例,特別適合初學者快速上手。

核心操作類別架構

以下程式碼展示一個封裝良好的 SqlOperateInfo 類別,內含連線字串、資料表名稱、預存程序名稱及 SQL 指令等私有欄位,三個公用方法分別示範不同資料存取模式:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace DatabaseOperate
{
    class SqlOperateInfo
    {
        // 連線字串設定
        private string sqlConnectionCommand = "Data Source=aa;Initial Catalog=bb;User ID=cc;Pwd=dd";
        private string dataTableName = "Basic_Keyword_Test";
        private string storedProcedureName = "Sp_InertToBasic_Keyword_Test";
        private string sqlSelectCommand = "Select KeywordID, KeywordName From Basic_Keyword_Test";
        private string sqlUpdateCommand = "Delete From Basic_Keyword_Test Where KeywordID = 1";

        // 模式一:使用 SqlDataReader 進行唯讀、順向資料流讀取
        public void UseSqlReader()
        {
            SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand);
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandType = System.Data.CommandType.Text;
            sqlCommand.Connection = sqlConnection;
            sqlCommand.CommandText = sqlSelectCommand;
            sqlConnection.Open();
            SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
            
            while(sqlDataReader.Read())
            {
                int keywordid = (int)sqlDataReader[0]; // 等同於 sqlDataReader["KeywordID"]
                string keywordName = (string)sqlDataReader[1]; // 等同於 sqlDataReader["KeywordName"]
                Console.WriteLine("KeywordID = " + keywordid + " , KeywordName = " + keywordName);
            }
            
            sqlDataReader.Close();
            sqlCommand.Dispose();
            sqlConnection.Close();
        }

        // 模式二:執行預存程序
        public void UseSqlStoredProcedure()
        {
            SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand);
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Connection = sqlConnection;
            sqlCommand.CommandText = storedProcedureName;
            sqlConnection.Open();
            sqlCommand.ExecuteNonQuery();
            // 若預存程序回傳結果集,也可改用 ExecuteReader
            sqlCommand.Dispose();
            sqlConnection.Close();
        }

        // 模式三:使用 DataSet 進行離線資料操作與批次更新
        public void UseSqlDataSet()
        {
            SqlConnection sqlConnection = new SqlConnection(sqlConnectionCommand);
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandType = System.Data.CommandType.Text;
            sqlCommand.Connection = sqlConnection;
            sqlCommand.CommandText = sqlSelectCommand;
            sqlConnection.Open();
            
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
            sqlDataAdapter.SelectCommand = sqlCommand;
            DataSet dataSet = new DataSet();
            
            // SqlCommandBuilder 可自動產生 Insert/Update/Delete 指令
            SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter);
            sqlDataAdapter.Fill(dataSet, dataTableName);
            
            // 對 DataSet 進行異動
            DataRow row = dataSet.Tables[0].NewRow();
            row[0] = 10000;
            row[1] = "new row";
            dataSet.Tables[0].Rows.Add(row);
            
            // 將變更寫回資料庫
            sqlDataAdapter.Update(dataSet, dataTableName);
            
            sqlCommand.Dispose();
            sqlDataAdapter.Dispose();
            sqlConnection.Close();
        }
    }
}

三大模式適用情境比較

模式特性適用場景
SqlDataReader高效能、唯讀、順向、連線導向大量資料快速讀取、報表產生、不需資料異動
Stored Procedure邏輯封裝在資料庫端、效能佳、安全性高複雜商務邏輯、批次處理、需交易控制的作業
DataSet/DataAdapter離線架構、支援多資料表關聯、可序列化WinForms/WebForms 資料繫結、需離線編輯、多層架構傳遞資料

關鍵技術細節補充

  • 參數化查詢:實務上應避免字串串接 SQL,改用 SqlParameter 防止 SQL Injection。
  • 資源釋放:善用 using 區塊確保連線、Reader、Command 正確釋放,避免連線洩漏。
  • 交易控制:跨多個指令的操作需搭配 SqlTransaction 確保 ACID 特性。
  • 連線池:ADO.NET 內建連線池機制,連線字串相同即可重用,提升效能。

進階延伸方向

掌握這三大基礎模式後,建議進一步學習:Entity Framework Core 等 ORM 框架、Dapper 等 Micro-ORM、非同步資料存取 (async/await)、資料庫遷移工具等現代化開發技術。

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