在處理 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 資料繫結、需離線編輯、多層架構傳遞資料 |
SqlParameter 防止 SQL Injection。using 區塊確保連線、Reader、Command 正確釋放,避免連線洩漏。SqlTransaction 確保 ACID 特性。掌握這三大基礎模式後,建議進一步學習:Entity Framework Core 等 ORM 框架、Dapper 等 Micro-ORM、非同步資料存取 (async/await)、資料庫遷移工具等現代化開發技術。