程式無法直接操作資料庫,需透過「介面」溝通。ADO.NET 提供三大核心類別建立連線、發送命令、讀取結果。
string strSql = "select top 10 city from Customers";
SqlConnection cn = new SqlConnection();
cn.ConnectionString = WebConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
SqlCommand cmd = new SqlCommand(strSql, cn);
cmd.CommandType = CommandType.Text;
cn.Open(); // 必須顯式開啟連線
// 三種執行方式:
// cmd.ExecuteNonQuery(); // INSERT/UPDATE/DELETE,回傳影響列數
// cmd.ExecuteReader(); // SELECT,回傳 SqlDataReader
// cmd.ExecuteScalar(); // 單一值查詢,回傳 object
ExecuteReader() 發送查詢命令Read() 逐筆讀取 SqlDataReader 內部資料(非逐筆查詢資料庫)GetXxx() 或索引器 dr["city"] 取得欄位值SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read()) {
lbTest.Items.Add(new ListItem(dr["city"].ToString()));
}
dr.Close(); cn.Close();
注意: 使用 SqlDataReader 期間必須保持連線開啟,關閉連線即失效。
ExecuteNonQuery:執行異動命令(INSERT/UPDATE/DELETE),回傳影響列數。若送 SELECT 會回傳 -1 不執行ExecuteReader:執行查詢命令,回傳 SqlDataReader。實測送 UPDATE 也能執行但不建議混用A 廠(程式)要 B 廠(資料庫)產品:修路(SqlConnection)→ 派車送訂單(SqlCommand)→ B 廠生產裝車→ A 廠收貨。SqlCommand 是唯一直接接觸資料庫的物件。
SqlDataReader 需保持連線且唯讀。若需離線操作資料,請期待下一篇介紹的 SqlDataAdapter 與 DataSet——可將資料載入記憶體斷線處理。
嚴重注意: 本文為個人理解筆記,可能有誤,請參考官方文件。