1. 程式人生 > 程式設計 >C# dataset存放多張表的例項

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["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"]);
      }

表之間的關係除了兩個表之間的關係,還有更復雜的多表連線。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。