SqlDataAdapter概述 SqlDataAdapter是 DataSet和 SQL Server之間的橋接器,用于檢索和保存數(shù)據(jù)。SqlDataAdapter通過對數(shù)據(jù)源使用適當?shù)腡ransact-SQL語句映射 Fill(它可更改DataSet中的數(shù)據(jù)以匹配數(shù)據(jù)源中的數(shù)據(jù))和 Update(它可更改數(shù)據(jù)源中的數(shù)據(jù)以匹配 Data
SqlDataAdapter概述
SqlDataAdapter是 DataSet和 SQL Server之間的橋接器,用于檢索和保存數(shù)據(jù)。SqlDataAdapter通過對數(shù)據(jù)源使用適當?shù)腡ransact-SQL語句映射 Fill(它可更改DataSet中的數(shù)據(jù)以匹配數(shù)據(jù)源中的數(shù)據(jù))和 Update(它可更改數(shù)據(jù)源中的數(shù)據(jù)以匹配 DataSet中的數(shù)據(jù))來提供這一橋接。當SqlDataAdapter填充 DataSet時,它為返回的數(shù)據(jù)創(chuàng)建必需的表和列(如果這些表和列尚不存在)。
我們可以通過以下三種方法來創(chuàng)建SqlDataAdapter對象:
使用方法
1、通過連接字符串和查詢語句
string strConn="uid=賬號;pwd=密碼;database=數(shù)據(jù)庫;server=服務器";//SQL Server鏈接字符串
strSql="SELECT * FROM 表名";
SqlDataAdapter da=new SqlDataAdapter(strSql,strConn);
DataSet ds=new DataSet();//創(chuàng)建DataSet實例
da.Fill(ds,"自定義虛擬表名");//使用DataAdapter的Fill方法(填充),調用SELECT命令
這種方法有一個潛在的缺陷。假設應用程序中需要多個SqlDataAdapter對象,用這種方式來創(chuàng)建的話,會導致創(chuàng)建每個SqlDataAdapter時,都同時創(chuàng)建一個新的SqlConnection對象,方法二可以解決這個問題
2、通過查詢語句和SqlConnection對象來創(chuàng)建
string strConn="uid=賬號;pwd=密碼;database=數(shù)據(jù)庫;server=服務器";//SQL Server鏈接字符串
SqlConnection conn=new SqlConnection(strConn);
string strSql="SELECT * FROM 表名";
SqlDataAdapter da = new SqlDataAdapter(strSql, conn);
DataSet ds=new DataSet();//創(chuàng)建DataSet實例
da.Fill(ds,"自定義虛擬表名");//使用DataAdapter的Fill方法(填充),調用SELECT命令
3、通過SqlCommand對象來創(chuàng)建
string strConn="uid=賬號;pwd=密碼;database=數(shù)據(jù)庫;server=服務器";//SQL Server鏈接字符串
SqlConnection connSql=new SqlConnection (strConn); //Sql鏈接類的實例化
connSql.Open ();//打開數(shù)據(jù)庫
//使用SqlDataAdapter時沒有必要從Connection.open()打開,
//SqlDataAdapter會自動打開關閉它。
string strSql = "SELECT * FROM 表名"; //要執(zhí)行的SQL語句
SqlCommand cmd=new SqlCommand(strSql,connsql);
SqlDataAdapter da=new SqlDataAdapter(cmd); //創(chuàng)建DataAdapter數(shù)據(jù)適配器實例
DataSet ds=new DataSet();//創(chuàng)建DataSet實例
da.Fill(ds,"自定義虛擬表名");//使用DataAdapter的Fill方法(填充),調用SELECT命令
ConnSql.Close ();//關閉數(shù)據(jù)庫
SqlDataAdapter da=new SqlDataAdapter(strSQL,ConnSql); //創(chuàng)建DataAdapter數(shù)據(jù)適配器實例DataSet ds=new DataSet();//創(chuàng)建DataSet實例da.Fill(ds,"自定義虛擬表名");//使用DataAdapter的Fill方法(填充),調用SELECT命令ConnSql.Close ();//關閉數(shù)據(jù)庫
注意
如果只需要執(zhí)行SQL語句或SP,就沒必要用到DataAdapter ,直接用SqlCommand的Execute系列方法就可以了。sqlDataadapter的作用是實現(xiàn)Dataset和DB之間的橋梁:比如將對DataSet的修改更新到數(shù)據(jù)庫。
SqlDataAdapter的UpdateCommand的執(zhí)行機制是:當調用SqlDataAdapter.Update()時,檢查DataSet中的所有行,然后對每一個修改過的Row執(zhí)行SqlDataAdapter.UpdateCommand ,也就是說如果未修改DataSet中的數(shù)據(jù),SqlDataAdapter.UpdateCommand不會執(zhí)行。
使用要點
1、SqlDataAdapter內部通過SqlDataReader獲取數(shù)據(jù),而默認情況下SqlDataReader不能獲知其查詢語句對應的數(shù)據(jù)庫表名,
所以下面的代碼:
string strConn = "uid=賬號;pwd=密碼;database=數(shù)據(jù)庫;server=服務器";//SQL Server鏈接字符串
strSql="SELECT * FROM 表名";
SqlDataAdapter da = new SqlDataAdapter(strSql,strConn);
DataSet ds = new DataSet();
da.Fill(ds);
會在DataSet中創(chuàng)建一個新的DataTable,這個新的DataTable會擁有名為CustomerID和CompanyName 列,但是DataTable對象的名稱是Table,而不是我們希望的Customers。
這個問題,可以通過添加TableMapping來解決:
string strConn="uid=賬號;pwd=密碼;database=數(shù)據(jù)庫;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=數(shù)據(jù)庫;server=服務器";//SQL Server鏈接字符串
strSql="SELECT * FROM 表名";
SqlDataAdapter da = new SqlDataAdapter(strSql, strConn);
DataTable tbl=new DataTable( );
da.Fill(tbl);
3、注意打開和關閉連接的處理
在調用SqlCommand對象執(zhí)行sql命令之前,需要保證與該對象關聯(lián)的SqlConnection對象時打開的,否則SqlCommand的方法執(zhí)行時將引發(fā)一個異常,但是我們在上面的代碼中看到,SqlDataAdapter沒有這樣的要求。
如果調用SqlDataAdapter的Fill方法,并且其SelectCommand屬性的SqlConnection是關閉狀態(tài),則SqlDataAdapter會自動打開它,然后提交查詢,獲取結果,最后關閉連接。如果在調用Fill方法前,SqlConnection是打開的,則查詢執(zhí)行完畢后,SqlConnection還將是打開的,也就是說SqlDataAdapter會保證SqlConnection的狀態(tài)恢復到原來的情形。
這有時會導致性能問題,需要注意,例如下面的代碼:
string strConn="uid=賬號;pwd=密碼;database=數(shù)據(jù)庫;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");
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com