類別結構
using System;
using System.Data;
using System.Data.SqlClient;
namespace Whgw_lc
{
public class Data
{
// 連線字串 (建議從 config 讀取)
protected static string ConnStr = "Data Source=10.68.19.203;Initial Catalog=Whgw;User ID=sa;Password=sc2000;";
protected SqlConnection Conn;
protected SqlDataAdapter Adapter;
protected SqlCommand Cmd;
protected SqlCommandBuilder CmdBuilder;
protected DataSet Ds;
protected DataRow Dr;
protected SqlDataReader Reader;
public Data()
{
Conn = new SqlConnection(ConnStr);
}
// 取得 DataSet
public DataSet GetDataSet(string sql)
{
Ds = new DataSet();
Adapter = new SqlDataAdapter(sql, Conn);
Adapter.Fill(Ds);
return Ds;
}
// 執行非查詢
public int ExecuteNonQuery(string sql)
{
Cmd = new SqlCommand(sql, Conn);
Conn.Open();
int ret = Cmd.ExecuteNonQuery();
Conn.Close();
return ret;
}
// 參數化查詢範例
public DataSet QueryWithParams(string sql, params SqlParameter[] parameters)
{
Ds = new DataSet();
Cmd = new SqlCommand(sql, Conn);
Cmd.Parameters.AddRange(parameters);
Adapter = new SqlDataAdapter(Cmd);
Adapter.Fill(Ds);
return Ds;
}
// 可擴充:Transaction、BulkCopy、DataReader、StoredProcedure 等
}
}
使用範例
var dal = new Data();
var ds = dal.GetDataSet("SELECT * FROM Users WHERE Status=1");
foreach (DataRow row in ds.Tables[0].Rows)
Console.WriteLine(row["UserName"]);
// 參數化
var ds2 = dal.QueryWithParams("SELECT * FROM Orders WHERE CustID=@cid AND Date>=@dt",
new SqlParameter("@cid", 1001),
new SqlParameter("@dt", DateTime.Today.AddDays(-30)));
設計重點
- 集中管理連線字串,支援設定檔注入。
- 封裝
SqlDataAdapter/SqlCommandBuilder 便於 Update() 批次寫回。
- 提供參數化方法預防 SQL Injection。
- 實作
IDisposable 確保連線正確釋放(此處省略)。