C# dataset存放多張表的實例
在C#中用同一個dataset保存從數據庫中取出的多張表:
cmd.CommandText = "select * from table1;"; NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd); //實例化一個類,它用於連接C#與數據庫,並執行cmd語句且將結果緩存到適配器中 DataSet thedataset = new DataSet(); //實例化一個dataset,實例名為thedataset(通常被定義為ds) da.Fill(thedataset, "thetable1"); //將適配器中的內容填充到dataset的thetable1表中, thetable1同時被建立 cmd.Parameters.Clear(); //清空cmd內容,如果不清空下次使用時會拋出異常 cmd.CommandText = "select * from table2;"; da = new NpgsqlDataAdapter(cmd); da.Fill(thedataset, "thetable2"); //將適配器中的內容填充到dataset的thetable2表中, thetable2同時被建立 cmd.Parameters.Clear(); //清空cmd內容 ... int count = thedataset.Tables["thetable1"].Rows.Count; //獲取表thetable1的行數 string a = thedataset.Tables["thetable2"].Rows[1][0].ToString().; //獲取表thetable2第2行第1列的值
補充:在DataSet中訪問多個表
ADO.Net模型有一個很大的優點,就是DataSet對象可以跟蹤多個表和它們之間的關系。這表示可以在一個操作的不同程序段之間傳遞完整的相關數據集,體系結構內在地維護數據之間關系的完整性。
ADO.Net中的DataRelation對象用於描述DataSet中的多個DataTables對象之間的關系。每個DataSet都包含DataRelations的Relations集合,以查找和操縱相關表。DataSet的Relations屬性是一個DataRelation對象的集合,DataRelation對象表示這個DataSet之間表之間的關系。要創建一個新的DataRelation,可以使用Relations的Add()方法,該方法接收表示關系的字符串名和兩個DataColumn(父列後跟子列)。比如:要創建Customers表的CustomerID列和Orders表的CustomerID列之間的關系 ,應使用下面的語法,把它們的關系命名為CustOrders。
DataRelation custOrderRel = ds.Relations.Add("CustOrders", ds.Tables["Customers"].Columns["CustomerID"], ds.Tables["Orders"].Columns["CustomerID"]);
為瞭使用有關系,需要從一張表的行進入另一張表的關聯行,這就是對關系導航。通常導航是指從一張表的父行進入另一張表的子行。那麼假如給定父表中的一行,如何獲取子表中與其對應的所有行呢?我們可以使用DataRow對象的GetChildRows()方法提取這些行。示例:一個顧客(Customers)表包含有一個或多個訂單(Orders)表,建立這兩個表之間的數據並提取數據的代碼如下。
static void Main(string[] args) { string connStr = @"Data Source=.\SQLEXPRESS; AttachDbFilename='C:\SQL Sever 2000 Sample Databases\NORTHWND.MDF';Integrated Security=True;User Instance=true"; SqlConnection conn = new SqlConnection(connStr); conn.Open(); //創建用於保存修改的數據的適配器 SqlDataAdapter adapter = new SqlDataAdapter("select CustomerID,CompanyName from Customers", conn); SqlCommandBuilder builder = new SqlCommandBuilder(adapter); //創建數據集 DataSet ds = new DataSet(); //創建讀取Customers表的適配器 SqlDataAdapter custAdapter = new SqlDataAdapter("select * from Customers", conn); //創建讀取Orders表的適配器 SqlDataAdapter orderAdapter = new SqlDataAdapter("select * from Orders", conn); //填充兩個表的數據並放到DataSet中 custAdapter.Fill(ds, "Customers"); orderAdapter.Fill(ds, "Orders"); //創建兩個表之間的關系 DataRelation custOrderRel = ds.Relations.Add("CustOrders", ds.Tables["Customers"].Columns["CustomerID"], ds.Tables["Orders"].Columns["CustomerID"]); foreach (DataRow custRow in ds.Tables["Customers"].Rows) { Console.WriteLine("Customer ID: " + custRow["CustomerID"] + "\tName: " + custRow["CompanyName"]); foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel)) { Console.WriteLine(" Order ID: "+orderRow["OrderID"]); } } conn.Close(); Console.ReadKey(); }
利用兩個表之間的關系訪問表中的數據的時候,我們還可以使用Linq over DataSet 。這需要導入System.Data.Linq命名空間。我們可以使用如下代碼代替上述代碼中的foreach部分:
var preferredCustomers = from c in Customers where c.GetChildRows("CustOrders").Length > 10 orderby c.GetChildRows("CustOrders").Length select c; Console.WriteLine("Customers with > 10 orders:"); foreach (var customer in preferredCustomers) { Console.WriteLine("{0} orders: {1} {2}, {3} {4}",customer.GetChildRows("CustOrders").Length, customer["CustomerID"],customer["CompanyName"],customer["City"],customer["Region"]); }
表之間的關系除瞭兩個表之間的關系,還有更復雜的多表連接。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- C#中DataSet,DataTable,DataView的區別與用法
- C#數據庫操作的示例詳解
- C# Datatable的幾種用法小結
- C#數據表格(DataGridView)控件的應用案例
- C# Sqlite數據庫的搭建及使用技巧