一、SqlConnection 連線 SQL Server
1. 引入命名空間
using System.Data.SqlClient;
2. 基本連線範例
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "user id=sa;password=sinofindb;initial catalog=test;data source=127.0.0.1;Connect Timeout=30";
conn.Open();
3. 改良版(建議實務採用)
string connStr = "user id=sa;password=sinofindb;Database=test;data source=127.0.0.1;Connect Timeout=30";
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
// 執行資料庫操作...
}
二、OleDbConnection 通用連線方式
1. 引入命名空間
using System.Data.OleDb;
2. 連線字串範例
| 資料庫類型 | 連線字串範例 |
| SQL Server (OLE DB) | Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=test;Integrated Security=SSPI; |
| Access (.mdb) | Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db2000.mdb;Persist Security Info=False; |
| Oracle | Provider=MSDAORA;Data Source=db;user id=sa;password=sinofindb |
提示: Access 連線字串可透過建立 .udl 檔案(通用資料連結)以視覺化方式產生。
三、SqlCommand 命令物件完整用法
1. 四種建構函式
// ① 無參數
SqlCommand cmd = new SqlCommand();
// ② 指定 SQL 文字
string sql = "SELECT * FROM mindata";
SqlCommand cmd = new SqlCommand(sql);
// ③ 指定 SQL 文字與連線
SqlCommand cmd = new SqlCommand(sql, conn);
// ④ 指定 SQL 文字、連線與交易
SqlTransaction trans = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand(sql, conn, trans);
2. 關聯連線與設定命令文字
// 方式一
cmd.Connection = conn;
// 方式二:由連線建立命令
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM mindata";
3. 多重查詢
以分號分隔多條 SQL 陳述句,可一次傳送多個查詢並取得多個結果集。
4. 四大執行方法對照
| 方法 | 回傳值 | 適用情境 |
ExecuteReader() | SqlDataReader | 查詢傳回一或多列資料 |
ExecuteNonQuery() | int (影響列數) | INSERT/UPDATE/DELETE 等非查詢操作 |
ExecuteScalar() | object (第一列第一欄) | 聚合函數、單一值查詢 |
ExecuteXmlReader() | XmlReader | 產生 XML 資料流 |
5. SqlDataReader 逐列讀取範例
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetString(0)); // 指定欄位以字串取值
Console.WriteLine(reader.GetValue(1)); // 以原生型別取值
}
}
6. ExecuteScalar 範例
cmd.CommandText = "SELECT COUNT(*) AS NumberOfRegions FROM region";
int count = (int)cmd.ExecuteScalar();
四、DataReader 進階操作
1. 三種索引方式
// 序數索引
while (reader.Read())
Console.WriteLine("{0}\t{1}", reader[0], reader[1]);
// 欄位名稱索引
while (reader.Read())
Console.WriteLine("{0}\t{1}", reader["code"], reader["name"]);
2. 型別存取器
| 方法 | 說明 |
GetChar(int) | 取得單一字元 |
GetDateTime(int) | 取得 DateTime 型別 |
GetInt16(int) | 取得 16 位元整數 |
GetString(int) | 取得字串 |
3. 取得結構描述資訊
int fieldCount = reader.FieldCount;
Type fieldType = reader.GetFieldType(ordinal);
string typeName = reader.GetDataTypeName(ordinal);
string colName = reader.GetName(ordinal);
int ordinal = reader.GetOrdinal("columnName");
DataTable schema = reader.GetSchemaTable();
4. 多結果集處理
do
{
while (reader.Read())
Console.WriteLine("{0}\t{1}", reader.GetInt32(0), reader.GetString(1));
} while (reader.NextResult());
五、SqlDataAdapter 與資料填充
1. 常用建構函式
// 空建構
SqlDataAdapter adapter = new SqlDataAdapter();
// 指定 SelectCommand
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
// SQL 字串 + 連線物件
SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
// SQL 字串 + 連線字串
SqlDataAdapter adapter = new SqlDataAdapter(sql, connStr);
2. Fill 方法多載
| 簽章 | 說明 |
Fill(DataSet) | 填入 DataSet,資料表命名為 "Table" |
Fill(DataSet, string) | 指定資料表名稱 |
Fill(DataSet, int, int, string) | 分頁填充(起始筆數、最大筆數、表名) |
Fill(DataTable) | 直接填入 DataTable |
六、DataSet 與相關集合類別速查
1. DataSet 建立與填充
DataSet ds = new DataSet("MyDataSet");
adapter.Fill(ds, "Customers");
2. DataTableCollection 存取
DataTableCollection tables = ds.Tables;
DataTable table = tables["Customers"];
3. DataTable.Select 動態篩選與排序
// 全部列
DataRow[] rows = table.Select();
// 篩選條件
DataRow[] rows = table.Select("id > 5");
// 篩選 + 排序
DataRow[] rows = table.Select("id > 5", "name DESC");
// 篩選 + 排序 + 列狀態
DataRow[] rows = table.Select("id > 5", "name DESC", DataViewRowState.CurrentRows);
七、DataView 動態視圖
1. 建立與篩選
DataView view = new DataView(ds.Tables["Suppliers"], "id > 5", "name DESC", DataViewRowState.CurrentRows);
2. 逐列列舉
foreach (DataRowView rowView in view)
{
for (int i = 0; i < view.Table.Columns.Count; i++)
Console.Write(rowView[i] + "\t");
Console.WriteLine();
}
總結: 本文系統整理了 ADO.NET 核心類別的建構、關聯、執行與資料讀取完整流程,適合作為開發速查手冊。實務上建議搭配 using 區塊管理連線與資源生命週期,並善用參數化查詢防範 SQL Injection。