SqlDataAdapter類常用操作
SqlDataAdapter常用於從數據庫中返回一個結果集時。
常用操作:
Fill();
示例:
static void Main(string[] args) { string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true"; SqlConnection conn = new SqlConnection(str); string strSql = "SELECT * FROM Person"; DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(strSql, conn); da.TableMappings.Add("Table","Person"); //指定原表數據與DataTable的映射關系 da.Fill(ds,"Person"); //將數據填充到指定的DataTable foreach (DataRow dr in ds.Tables["Person"].Rows) { Console.WriteLine(dr["Id"].ToString() + dr["Name"].ToString() + dr["Age"].ToString()); } //當然也可以直接Fill,DataTable DataTable dt = new DataTable(); da.Fill(dt); //當然Fill兩次這里會有問題 foreach (DataRow dr in dt.Rows) { Console.WriteLine(dr["Id"].ToString() + dr["Name"].ToString() + dr["Age"].ToString()); } Console.ReadKey(); }
1、多次開啟關閉連接的問題
也許我們已經留意到,使用SqlDataAdapter 不需要打開和關閉數據庫連接。如果調用SqlDataAdapter的Fill方法,並且其SelectCommand屬性的SqlConnection是關閉狀態,則SqlDataAdapter會自動打開它,然后提交查詢,獲取結果,最后關閉連接。如果在調用Fill方法前,SqlConnection是打開的,則查詢執行完畢后,SqlConnection 還將是打開的,也就是說SqlDataAdapter會保證SqlConnection的狀態恢復到原來的情形。
看來SqlDataAdapter還是非常人性化的。但是這樣會產生一個問題。假如數據庫連接原本是關閉的,在查詢的時候並沒有打開,而直接Fill了兩次,這樣會導致數據庫連接被打開和關閉了兩次。這樣是會影響效率的。在調用Fill時各打開和關閉了一次。
為了避免多次打開和關閉數據庫連接,我們可以這樣:
cn.Open(); da.Fill(ds,"Person"); da.Fill(dt); cn.Close();
2、多次調用Fill方法需要注意數據重復和有效更新數據的問題
假如我們多次調用了Fill方法Fill同一個DataTable
da.Fill(ds,"Customers"); ……. da.Fill(ds,"Customers");
通過兩次調用Fill方法,SqlDataAdapter執行兩次查詢,並兩次將查詢結果保存到DataSet中,第一次調用在DataSet中創建了一個名為Customers的新表。第二次調用Fill方法將查詢的結果追加到DataSet中的同一個表中,因此,每個客戶的信息將在DataSet中出現兩次!當然,如果數據庫管理員對Customers表定義了主鍵,則SqlDataAdapter在天成DataTable時,會判斷重復行,並自動丟棄掉舊的值。
考慮一下,假定一個特定客戶在第一次調用Fill方法時,存儲於數據庫中,那么SqlDataAdapter會將其添加到新建的DataTable中。如果后來這個客戶被刪除了,那么第二次調用Fill方法時,SqlDataAdapter將不會在查詢結果中找到該客戶信息,但是它也不會將客戶信息從DataSet中刪除。這就導致了數據更新的問題。
InsertCommand
static void Main(string[] args) { //INSERT實例,好復雜 string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true"; SqlConnection conn = new SqlConnection(str); DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); SqlDataAdapter adapter = new SqlDataAdapter(); //adapter.Fill(dt); dt.Rows.Add(new object[] { "5", "曹操", "29" }); adapter.InsertCommand = new SqlCommand("INSERT INTO Person(Id,Name,Age) values(@ID,@Name,@Age)", conn); adapter.InsertCommand.Parameters.Add("Id", SqlDbType.Int); adapter.InsertCommand.Parameters.Add("Name", SqlDbType.VarChar); adapter.InsertCommand.Parameters.Add("Age", SqlDbType.Int); adapter.InsertCommand.Parameters["Id"].SourceColumn = "Id"; adapter.InsertCommand.Parameters["Name"].SourceColumn = "Name"; adapter.InsertCommand.Parameters["Age"].SourceColumn = "Age"; adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; //adapter.Fill(dt); if (dt.Rows.Count > 0) { adapter.Update(dt); } Console.ReadKey(); }
UpdateCommand
static void Main(string[] args) { //Update實例 string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true"; using (SqlConnection conn = new SqlConnection(str)) { conn.Open(); DataSet ds = new DataSet(); string sql = "select * from Person"; SqlDataAdapter adapate = new SqlDataAdapter(sql, conn); adapate.Fill(ds, "Person"); ds.Tables["Person"].Rows[0]["Name"] = "改改改"; //動態生成的UpdateCommand必須要有主鍵 SqlCommandBuilder builder = new SqlCommandBuilder(adapate); adapate.Update(ds, "Person"); } Console.ReadKey(); }
DeleteCommand
static void Main(string[] args) { //Delete實例 string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true"; using (SqlConnection conn = new SqlConnection(str)) { DataSet ds = new DataSet(); string sql = "SELECT * FROM Person"; SqlDataAdapter adapter = new SqlDataAdapter(sql, conn); adapter.Fill(ds, "Person"); adapter.DeleteCommand = new SqlCommand("DELETE FROM Person WHERE Id=@Id", conn); adapter.DeleteCommand.Parameters.Add("Id", SqlDbType.Int); adapter.DeleteCommand.Parameters["Id"].SourceColumn = "Id"; //刪除第一行 ds.Tables["Person"].Rows[0].Delete(); Console.WriteLine(ds.Tables["Person"].Rows.Count); adapter.Update(ds.Tables["Person"]); } Console.ReadKey(); }