程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> C#中Sql DataAdapter的使用

C#中Sql DataAdapter的使用

編輯:關於SqlServer

       SqlDataAdapter概述

      SqlDataAdapter是 DataSet和 SQL Server之間的橋接器,用於檢索和保存數據。SqlDataAdapter通過對數據源使用適當的Transact-SQL語句映射 Fill(它可更改DataSet中的數據以匹配數據源中的數據)和 Update(它可更改數據源中的數據以匹配 DataSet中的數據)來提供這一橋接。當SqlDataAdapter填充 DataSet時,它為返回的數據創建必需的表和列(如果這些表和列尚不存在)。

      我們可以通過以下三種方法來創建SqlDataAdapter對象:

      使用方法

      1、通過連接字符串和查詢語句

      string strConn="uid=賬號;pwd=密碼;database=數據庫;server=服務器";//SQL Server鏈接字符串

      strSql="SELECT * FROM 表名";

      SqlDataAdapter da=new SqlDataAdapter(strSql,strConn);

      DataSet ds=new DataSet();//創建DataSet實例

      da.Fill(ds,"自定義虛擬表名");//使用DataAdapter的Fill方法(填充),調用SELECT命令

      這種方法有一個潛在的缺陷。假設應用程序中需要多個SqlDataAdapter對象,用這種方式來創建的話,會導致創建每個SqlDataAdapter時,都同時創建一個新的SqlConnection對象,方法二可以解決這個問題

      2、通過查詢語句和SqlConnection對象來創建

      string strConn="uid=賬號;pwd=密碼;database=數據庫;server=服務器";//SQL Server鏈接字符串

      SqlConnection conn=new SqlConnection(strConn);

      string strSql="SELECT * FROM 表名";

      SqlDataAdapter da = new SqlDataAdapter(strSql, conn);

      DataSet ds=new DataSet();//創建DataSet實例

      da.Fill(ds,"自定義虛擬表名");//使用DataAdapter的Fill方法(填充),調用SELECT命令

      3、通過SqlCommand對象來創建

      string strConn="uid=賬號;pwd=密碼;database=數據庫;server=服務器";//SQL Server鏈接字符串

      SqlConnection connSql=new SqlConnection (strConn); //Sql鏈接類的實例化

      connSql.Open ();//打開數據庫

      //使用SqlDataAdapter時沒有必要從Connection.open()打開,

      //SqlDataAdapter會自動打開關閉它。

      string strSql = "SELECT * FROM 表名"; //要執行的SQL語句

      SqlCommand cmd=new SqlCommand(strSql,connsql);

      SqlDataAdapter da=new SqlDataAdapter(cmd); //創建DataAdapter數據適配器實例

      DataSet ds=new DataSet();//創建DataSet實例

      da.Fill(ds,"自定義虛擬表名");//使用DataAdapter的Fill方法(填充),調用SELECT命令

      ConnSql.Close ();//關閉數據庫

      SqlDataAdapter da=new SqlDataAdapter(strSQL,ConnSql); //創建DataAdapter數據適配器實例DataSet ds=new DataSet();//創建DataSet實例da.Fill(ds,"自定義虛擬表名");//使用DataAdapter的Fill方法(填充),調用SELECT命令ConnSql.Close ();//關閉數據庫

      注意

      如果只需要執行SQL語句或SP,就沒必要用到DataAdapter ,直接用SqlCommand的Execute系列方法就可以了。sqlDataadapter的作用是實現Dataset和DB之間的橋梁:比如將對DataSet的修改更新到數據庫。

      SqlDataAdapter的UpdateCommand的執行機制是:當調用SqlDataAdapter.Update()時,檢查DataSet中的所有行,然後對每一個修改過的Row執行SqlDataAdapter.UpdateCommand ,也就是說如果未修改DataSet中的數據,SqlDataAdapter.UpdateCommand不會執行。

      使用要點

      1、SqlDataAdapter內部通過SqlDataReader獲取數據,而默認情況下SqlDataReader不能獲知其查詢語句對應的數據庫表名,

      所以下面的代碼:

      string strConn = "uid=賬號;pwd=密碼;database=數據庫;server=服務器";//SQL Server鏈接字符串

      strSql="SELECT * FROM 表名";

      SqlDataAdapter da = new SqlDataAdapter(strSql,strConn);

      DataSet ds = new DataSet();

      da.Fill(ds);

      會在DataSet中創建一個新的DataTable,這個新的DataTable會擁有名為CustomerID和CompanyName 列,但是DataTable對象的名稱是Table,而不是我們希望的Customers。

      這個問題,可以通過添加TableMapping來解決:

      string strConn="uid=賬號;pwd=密碼;database=數據庫;server=服務器";//SQL Server鏈接字符串

      strSql="SELECT * FROM 表名";

      SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);

      da.TableMappings.Add("Table","Customers"); // 設置對象名稱

      DataSet ds=new DataSet();

      da.Fill(ds);

      其實最簡潔的方法是通過使用Fill方法的重載,通過指定DataTable,像這樣:

      SqlDataAdapter.Fill(DataSet,"MyTableName");

      這樣就可以不必使用TableMappings集合。

      2、在使用Fill方式時,可以指定DataTable,而不是DataSet:

      string strConn="uid=賬號;pwd=密碼;database=數據庫;server=服務器";//SQL Server鏈接字符串

      strSql="SELECT * FROM 表名";

      SqlDataAdapter da = new SqlDataAdapter(strSql, strConn);

      DataTable tbl=new DataTable( );

      da.Fill(tbl);

      3、注意打開和關閉連接的處理

      在調用SqlCommand對象執行sql命令之前,需要保證與該對象關聯的SqlConnection對象時打開的,否則SqlCommand的方法執行時將引發一個異常,但是我們在上面的代碼中看到,SqlDataAdapter沒有這樣的要求。

      如果調用SqlDataAdapter的Fill方法,並且其SelectCommand屬性的SqlConnection是關閉狀態,則SqlDataAdapter會自動打開它,然後提交查詢,獲取結果,最後關閉連接。如果在調用Fill方法前,SqlConnection是打開的,則查詢執行完畢後,SqlConnection還將是打開的,也就是說SqlDataAdapter會保證SqlConnection的狀態恢復到原來的情形。

      這有時會導致性能問題,需要注意,例如下面的代碼:

      string strConn="uid=賬號;pwd=密碼;database=數據庫;server=服務器";//SQL Server鏈接字符串

      SqlConnection conn=new SqlConnection(strConn);

      SqlDataAdapter daCustomers,daOrders;

      strSql="SELECT * FROM Customers";

      daCustomers = new SqlDataAdapter(strSql, conn);

      strSql="SELECT * FROM Orders";

      daOrders=new SqlDataAdapter(strSql, conn);

      DataSet ds=new DataSet();

      daCustomers.Fill(ds,"Customers");

      daOrders.Fill(ds,"Orders");

      以上代碼會導致連接被打開和關閉兩次,在調用Fill方法時各一次。為了避免打開和關閉SqlConnection對象,在調用SqlDataAdapter對象的Fill方法之前,我們可以先打開SqlConnection對象,如果希望之後關閉連接,我們可以再調用Close方法,就像這樣:

      cn.Open();

      daCustomers.Fill(ds,"Customers");

      daOrders.Fill(ds,"Orders");

      cn.Close();

      4、多次調用Fill方法需要注意數據重復和有效更新數據的問題

      string strConn="uid=賬號;pwd=密碼;database=數據庫;server=服務器";//SQL Server鏈接字符串

      strSql="SELECT * FROM Customers";

      SqlDataAdapter da=new SqlDataAdapter(strSql, strConn);

      DataSet ds=new DataSet();

      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中刪除。這就導致了數據更新的問題。

      所以推薦的做法是,在調用Fill方法前,先刪除本地DataSet中緩存的數據!

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved