DataSet 用法


DataSet
作用:DataSet,DataAdapter讀取數據。
問:什么是DataAdapter?
答:DataAdapter對象在DataSet與數據之間起橋梁作用

string strConn="uid=賬號;pwd=密碼;database=數據庫;server=服務器";//SQL Server鏈接字符串
SqlConnection ConnSql=new SqlConnection (strConn); //Sql鏈接類的實例化
ConnSql.Open ();//打開數據庫
string strSQL="SELECT * FROM 表名1 "; //要執行的SQL語句
SqlDataAdapter da=new SqlDataAdapter(strSQL,ConnSql); //創建DataAdapter數據適配器實例
DataSet ds=new DataSet();//創建DataSet實例
da.Fill(ds,"自定義虛擬表名");//使用DataAdapter的Fill方法(填充),調用SELECT命令
ConnSql.Close ();//關閉數據庫

 

使用SqlDataAdapter時,需要注意的幾點

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

string strConn,strSQL;

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;";

strSql="SELECT CustomerID,CompanyName FROM Customers";

SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);

DataSet ds=new DataSet();

da.Fill(ds);

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

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

string strConn,strSQL; 

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;"; 

strSql="SELECT CustomerID,CompanyName FROM Customers"; 

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,strSQL; 

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;"; 

strSql="SELECT CustomerID,CompanyName FROM Customers"; 

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,strSQL; 

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;";

SqlConnection cn=new SqlConnection(strConn);

SqlDataAdapter daCustomers,daOrders;

strSql="SELECT CustomerID,CompanyName FROM Customers";

daCustomers=new SqlDataAdapter(strSql,cn);

strSql="SELECT OrderID,CustomerID,OrderDate  FROM Orders";

daOrders=new SqlDataAdapter(strSql,cn);

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,strSQL; 

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;";

strSql="SELECT CustomerID,CompanyName 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中緩存的數據!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM