ADO.NET知识学习总结
1. 概述?
???????? 使用的命名空間: System.Data.SqlClient
???????? 連接字符串??? 服務器/數據庫實例+數據庫名稱+安全信息+用戶名+密碼? 可參考http://www.connectionstrings.com
?
2. 常用類
?? ( 1) SqlConnection類
???????? 1). 處理連接相關事項
???????? 2). 實現了IDisposable接口,因此使用完之后資源要釋放 一般使用 using語句資源管理機制 或 try-catch-finally。
??????????????????? 類似的類型還有 FileStream 類型。 conn.Close()方法 只關閉連接而不釋放,仍可再次打開
?????????????????????????????????????????????????????????????????????? conn.Dispose(bool)方法 完成釋放連接,已包含 Close() 方法。
???????? 3). CreateCommand()方法??? public System.Data.SqlClient.SqlCommand CreateCommand()?
??????????????????? 返回 SqlCommand 類型的對象
?
(2) SqlCommand類? (除使用new外,另可由SqlConnection類的CreateConnection()生成對象)
??????? 1). 處理命令相關事項
??????? 2). 實現了IDisposable接口,因此使用完之后資源要釋放 一般使用 using語句資源管理機制 或 try-catch-finally。
????? ? 3). CommandText屬性?? public override string CommandText { set; get; } 存放SQL語句
??????? 4). Parameters屬性??? public System.Data.SqlClient.SqlParameterCollection Parameters { get; }
???????????????????? 通常使用 Add 方法?
??????????????????????????????????????????????????? ?
??????????????????? Clear()方法?? public override void Clear()
??????????????????????????? 通常,對于while循環里的同一個Connection,每次添加的參數要清除后才能再添加。
??????????????????????????? 此方法從SqlParameterCollection 中移除所有SqlParameter 對象。
??????? 5). ExecuteNonQuery()方法? public override int ExecuteNonQuery()
????????????????????????????????????????????????? 對應非查詢語句,如 insert/delete/update。 返回受影響的行數。
??????? 6). ExecuteReader()方法? public System.Data.SqlClient.SqlDataReader ExecuteReader()
???????????????????????????????????????????? 對應查詢語句。
??????? 7). ExecuteScalar()方法? public override object ExecuteScalar()
?????????????????????????????????????????? 對應查詢語句,返回結果集的第一行第一列數據,類型為Object, 使用時要轉換。
?????????????????????????????????????????? 使用動機: 多結合SQL語句: select count(*) from…用在判斷是否返回數據,以作進一步操作
?
(3) SqlDataReader類
??????? 1). 實現了IDisposable接口,因此使用完之后資源要釋放 一般使用 using語句資源管理機制 或 try-catch-finally。
??????? 2). 除使用new外,另可由SqlCommand類的ExecuteReader()生成對象
??????? 3). 其對象實質為指針,對應于數據庫游標。本身不存儲數據,知道讀時,才會取數據庫中數據
??????? 4). Reader()?? public override bool Read()
???????????????????????? 使SqlDataReader 前進到下一條記錄, 如果存在多個行,則為 true;否則為 false。
???????????????????????? 常與while() 語句組合使用。
??????? 5). GetOrdinal(string)方法?? public override int GetOrdinal(string name)
????????????????????????????????????? 在給定列名稱的情況下獲取列序號,參數name: 列的名稱,返回從零開始的列序號。
??????? 6). GetString(int)、GetInt32(int)等方法??
????????????????????????????????????? 只接受整形參數,得到相應的值。
?
using(SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Workspace\Database1.mdf;Integrated Security=True;User Instance=True")) {conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = "select * from T_User";using (SqlDataReader reader = cmd.ExecuteReader()){while (reader.Read()){ //取出當前行的第1列的數據Console.WriteLine(reader.GetString(1));//其中reader.GetOrdinal("UserName")是根據字段名得到這一列的序號Console.WriteLine("跟據用戶名得到根:"+reader.GetString(reader.GetOrdinal("UserName
"))}}} }鏈接
SQL表名最好不要為關鍵字,如果需要,則在查詢字符串中使用“[ ]”。 要想得到自動增長字段的主鍵值,在SQL語句中的values關鍵字前加上“output inserted.Id
”(Id為主鍵字段名) insert into T_Users(username,password) output inserted.ID values(‘admin’,'888’) int i=Convert.Toint32(cmd.Executescalar); @usename 表示此處用參數替代,在SqlConnection的Parameters屬性中添加參數?
(4) SqlParameter類
??????? 1) 為防止注入式攻擊。
??????? 2) public sealed class SqlParameter : System.Data.Common.DbParameter
??????? 3) 表示 System.Data.SqlClient.SqlCommand 的參數,也可以是它到 System.Data.DataSet 列的映射。此類不能被
??????????? 繼承。
??????? 4) 構造函數
???????????????????????? public SqlParameter(string parameterName, object value)
????????????????????????????
???????????????? 一個缺陷:由于System.Data.SqlDbType是枚舉類型,枚舉值為整數,上面的構造函數經常與下圖第四個混用。
???????????????????????????????? 如value為0時,改進方法:SqlParameter("id”,0)變為 SqlParame("id",(object)0);
???????????????????????? 其他構造函數,可參考相關文獻
??????????????????????????????????
?
?
2. 相關知識
????? (1). ConfigurationManager類? public static class ConfigurationManager
???????????? 1). 在命名空間 System.Configuration 中定義
???????????? 2). 提供對客戶端應用程序配置文件的訪問。無法繼承此類。
???????????? 3). 在部署的應用程序中,修改配置信息,可通過./bin/Debug/項目名.config文件。
????????????
??????????????????????????? string constr=ConfigurationManager.ConnectionStrings[“txl”].ConnectionString;
?? ? (2).封裝連接? SQLHelper
class SQLHelper {//ExecuteNonQuery("insert into t(f1,f2) values(@f1,@f2)",p1,p2,p3,p4)public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters){string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;using (SqlConnection conn = new SqlConnection(constr)) {conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;//需要兩個SqlParameter對象foreach (SqlParameter parameter in parameters){cmd.Parameters.Add(parameter);}return cmd.ExecuteNonQuery();}}}public static object ExecuteScalar(string sql, params SqlParameter[] parameters){string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;using (SqlConnection conn = new SqlConnection(constr)){conn.Open();using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = sql;foreach (SqlParameter parameter in parameters){cmd.Parameters.Add(parameter);}return cmd.ExecuteScalar();}}}//不宜封裝,因為當SQLHelper.ExecuteReader()執行完之后,返回的DataReader對象已不能用了//若想使用,可利用DataSet機制public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] parameters){} }??????????
3. 弱類型
?
??? (1). DataSet類
??????? 1).數據在內存中的緩存,服務器斷開不影響數據的讀取。
??????? 2).包含若干張DataTable, DataTable包含若干行DataRow。
??????? 3).Tables屬性?? public System.Data.DataTableCollection Tables { get; }? 獲取包含在DataSet中的表DataTable的集合
??????? 4).GetChanges()方法? public System.Data.DataSet GetChanges() 得到修改后“結果集”,降低傳遞的資源占用。
??????????????? 獲取 System.Data.DataSet 的副本,該副本包含自加載以來或自上次調用 DataSet.AcceptChanges() 以來對該數據集進行的所有更改。可以對該副本執行操作,然后可以使用 DataSet.Merge(DataSet) 將其合并回去。如果未找到更改的行,則該方法將返回 null。
??????? 5).AcceptChanges()方法? public void AcceptChanges()
???????????????? 提交自加載此DataSet 或上次調用DataSet.AcceptChanges() 以來對其進行的所有更改。
?
??? (2). DataTable類
??????? 1). 表示內存中數據的一個表。
??????? 2). 包含若干行DataRow
??????? 3). Rows屬性? public System.Data.DataRowCollection Rows { get; }
??????????????????? 獲取屬于該表的行的集合。返回值:包含 System.Data.DataRow 對象的 System.Data.DataRowCollection;否則為 null 值(如果不存在任何 System.Data.DataRow 對象)。
??????? 4). NewRow()方法? public System.Data.DataRow NewRow()
???????????????????? 創建與該表具有相同架構的新 System.Data.DataRow。
??????? 5). AcceptChanges()方法,GetChanges()方法? 同DataSet類類似
?????????????????? public void AcceptChanges(), public System.Data.DataTable GetChanges()
??????? 6)與DataSet關系
?????????????????? DataSet類的 DataTableCollection類型的屬性存放此類對象的集合。它有Add(),Remove(),RemoveAt()方法等。可使用”索引指示器“機制讀寫相關數據。
?
?? (3). DataRow類
?????? 1).表示 System.Data.DataTable 中的一行數據
?????? 2).AcceptChanges()方法 public void AcceptChanges()
???????????????????? 提交自上次調用 System.Data.DataRow.AcceptChanges() 以來對該行進行的所有更改。
?????? 3)與DataTable關系
?????????????? DataTable類的 DataRowCollection類型的屬性存放此類對象的集合。它有count屬性
RemoveAt()方法等。可使用”索引指示器“機制讀寫相關數據。
?
?? (4). SqlDataAdapter類
?????? 1). 表示用于填充 System.Data.DataSet 和更新 SQL Server 數據庫的一組數據命令和一個數據庫連接。無法繼承此類。
??????? 2). 構造函數
??????????????????
?????????????? 前兩個構造函數的第一個參數是指 SqlDataAdapter類的SelectCommand屬性。是T-SQL查詢語或存儲過程。
???????? 3). Update()方法
??????????????????
???????????????????
???????????????? 為指定的對象插入、已更新或已刪除的行,調用相應的 INSERT、UPDATE 或 DELETE 語句。
???????????????? 即提交的對象可以是? DataSet,DataTable 或者 若干行DataRow。
?
???????? 4). Fill()方法
??????????????????
???????????????????? 在指定范圍中添加或刷新行以匹配使用DataSet或DataTable 名稱的數據源中的行。
??????? 5). DeleteCommand? 獲取或設置用于從數據集中刪除記錄的命令。
???????????? InsertCommand? 獲取或設置用于將新記錄插入到數據源中的命令。
???????????? UpdateCommand? 獲取或設置用于更新數據源中的記錄的命令。
??????? 6). 提交數據時,為自動生成Command,可以使用 SqlCommandBuilder類
???????????? 即 在 Update()或Fill()方法之前加入一句
????????????????????? SalCommandBuilder builder=new SqlCommandBuilder(adapter);
???????????? adapter使用的 SqlDataAdapter 對象。
???????????? 使用前提: 表必須有主鍵。
????
???? (5). 可空類型
???????? 1).int、GuId、bool等 值類型 不能賦值為NULL,但String等 應用類型可賦值為NULL。
???????????? 數據庫int類型字段可以賦值為NULL,這就產生了C#語言與數據庫的矛盾。
???????????? 解決:可控類型???? int? i1=NULL;??? int? i2, i3;? int i4=1;
???????? 2). 判斷??? i3==NULL? true(為空)/false(不為空)?????? i1.HasValue()?? true(不為空)/false(為空)
???????????? 轉換??? 可空類型to非空類型????? 顯式??? i4=i1.Value();
??????????????????????? 非空類型to可空類型????? 不需要顯式? i2=i4;
????
??? (6). 總結
?????????? 弱類型缺點:
????????????? 1). 只能通過”字段名“引用。 如果寫錯了字段名編譯時不會發現錯誤。如 dataset.Tables[0].Rows[0][“age”];
????????????? 2). 需類型轉換。如 int age=Convert.ToInt32(dataset.Tables[0].Rows[0][“age”]); 取出的為Object類型,易出錯。
????????????? 3).運行時方知所有列名,數據綁定麻煩,不適應快速開發。
?
?
4 Typed DateSet?? (一切都是自動生成)
?
?????? (1).字符串:? 項目文件?? Property下的Settings.Settings查看
?????????????????????????????? 部署后在?? bin/Debug/項目名稱.config文件中
?????? (2). 表名TableAdapter類
??????????????????????? GetData() 返回 表名DataTable 一般首次返回DataTable時使用
??????????????????????? Fill(DataSet) 提交
??????????????????????? Update(DataSet) 提交?? 可能會發生異常,程序需通過主鍵來定義需要更新的行。
??????????????????????????????????????????????????????????? 處理方法:?? 數據庫設主鍵,DataTable右擊“配置”
???????????????? 以上方法都有對應的SQL語句。也可自定義SQL語句,生成對應的方法(dataset右擊“添加”)
???????????????????????? Connection屬性 擁有open() 、close()和 state屬性
?
??????? (3).項目名DataSet類、表名DataTable類和表名Row類
?????????
??????? (4). 優缺點
???????????????? 1) 每次修改”字段“需重新生成DataSet
???????????????? 2) 通過列名取數據需保證字段值不能為NULL,否則會報異常。因此,使用之前需判空 IsValueNull()方法
?
5 其他類型
Technorati 標簽: ado.net,dataset???
????? (1)Stopwatch類? 在 System.Diagnostics命名空間下?? 秒表計時類
??????????????????????????????????? Start()、Stop()和 public System.TimeSpan Elapsed { get; }屬性(獲取當前實例測量得出的總運行時間)
????? (2)MessageBox類? 在System.Windows.Forms命令空間下
????????????????????????????????????? 顯示可包含文本、按鈕和符號(通知并指示用戶)的消息框。
????????????????????????????????????? 一個Show()方法用于顯示具有指定內容的消息框。
????? (3)ComboBox類?? public class ComboBox : System.Windows.Forms.ListControl
???????????????????????????????????? 下拉列表組合框
???????????????????????????????????? Items屬性?? public System.Windows.Forms.ComboBox.ObjectCollection Items { get; }?
????????????????????????????????????????????? 獲取一個對象,該對象表示該ComboBox 中所包含項的集合。
???????????????????????????????????? SelectedItem屬性?? public object SelectedItem { get;? set; }
????????????????????????????????????????????? 獲取或設置 ComboBox 中當前選定的項。
???????????????????????????????????? SelectedIndexChanged事件? System.Windows.Forms.ComboBox.SelectedIndexChanged
?????????????????????????????????????????????? 在 System.Windows.Forms.ComboBox.SelectedIndex 屬性更改后發生
???????????????????????????????????? ToString()方法
???????????????????????????????????? 分清 DisplayMember和ValueMember
?
轉自:http://www.cnblogs.com/dadashazhu/archive/2012/02/18/2356863.html
轉載于:https://www.cnblogs.com/eagle1986/archive/2012/02/25/2368219.html
總結
以上是生活随笔為你收集整理的ADO.NET知识学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于.NET的图表控件解决方案
- 下一篇: 紧紧的把握现在