プログラミングADO.NETを読む

一週間かけてやっと半分。ゲームしてる隣だと、集中できない;;
電車の中で座って読むのが一番集中できるねえ。

結合クエリを使用して、DataSet内にDataTable作成するのはあまり良くないらしい。
DataAdapterとテーブルが1対1の関係にして、DataRelationで関連付けるようにする。


static void Main(string[] args)
{
SqlConnection con = new SqlConnection("Integrated Security=SSPI;" +
"Persist Security Info=False;Initial Catalog=Northwind;Data Source=(local);" );
DataSet ds = new DataSet();

SqlDataAdapter daCustomers = new SqlDataAdapter(
"SELECT CustomerID, CompanyName FROM Customers", con );
SqlDataAdapter daOrders = new SqlDataAdapter(
"SELECT CustomerID, OrderID, OrderDate FROM Orders", con );

daCustomers.Fill( ds, "Customers" );
daOrders.Fill( ds, "Orders" );

ds.Relations.Add( "CustomersOrders",
ds.Tables["Customers"].Columns["CustomerID"],
ds.Tables["Orders"].Columns["CustomerID"], false );

// 計算列の追加
ds.Tables["Customers"].Columns.Add( "OrdersCount", typeof(int), "Count(Child.OrderID)" );

// 親テーブルの列でループ
foreach( DataRow rowCustomer in ds.Tables["Customers"].Rows )
{
Console.WriteLine("{0}-{1}", rowCustomer["CustomerID"], rowCustomer["CompanyName"] );
Console.WriteLine("Orders Count:{0}", rowCustomer["OrdersCount"] );

// 親に関連付けられている子レコード出力
foreach( DataRow rowOrder in rowCustomer.GetChildRows("CustomersOrders") )
{
Console.WriteLine("\t{0}-{1}",rowOrder["OrderID"], rowOrder["OrderDate"] );
}
}
}


昔のADOやODBCに慣れてしまっていると、頭の切り替えが難しい。

  • ほしいテーブル同士を結合して、DataReaderで一行ずつ読みながら表示。
  • 変更結果をUpdate文に結合して即実行。

が、楽でいいかなぁ。

ADO.NET初めてでも、DataReaderで読んでSqlCommandで実行ならみんな理解できるし。
う〜〜〜む