SqlDataAdapter是 DataSet和 SQL Server之間的橋接器,用於檢索和保存數據。SqlDataAdapter通過對數據源使用適當的Transact-SQL語句映射 Fill(它可更改DataSet中的數據以匹配數據源中的數據)和 Update(它可更改數據源中的數據以匹配 DataSet中的數據)來提供這一橋接。當SqlDataAdapter填充 DataSet時,它為返回的數據創建必需的表和列(如果這些表和列尚不存在)。
使用方法
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命令
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();//關閉數據庫
注意
如果只需要執行SQL語句或SP,就沒必要用到DataAdapter ,直接用SqlCommand的Execute系列方法就可以了。sqlDataadapter的作用是實現Dataset和DB之間的橋梁:比如將對DataSet的修改更新到數據庫。
SqlDataAdapter的UpdateCommand的執行機制是:當調用SqlDataAdapter.Update()時,檢查DataSet中的所有行,然后對每一個修改過的Row執行SqlDataAdapter.UpdateCommand ,也就是說如果未修改DataSet中的數據,SqlDataAdapter.UpdateCommand不會執行。
1、在使用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);
2、注意打開和關閉連接的處理
在調用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方法,就像這樣:
conn.Open() 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"); conn.Close();
3、多次調用Fill方法需要注意數據重復和有效更新數據的問題
推薦的做法是,在調用Fill方法前,先刪除本地DataSet中緩存的數據!
