テーブルアダプタと TransactionScope の組み合わせ

さて、Silverlight 2 や WCF などの最新テクノロジの話ばっかりここまで書いてきたので、たまには地味(けれどもめちゃめちゃ重要)な話をひとつ書いてみたりします。結論を先に書くと、以下の通りです。 「SQL Server 2008 と .NET Framework 2.0 SP1 を使うと、テーブルアダプタと TransactionScope を組み合わせる際の昇格条件が緩和される(=MS-DTC 昇格せずに済むことがある)」 具体的には、以下のようなコードで MS-DTC 昇格が発生しなくなります。 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) { PubsDataSetTableAdapters.QueriesTableAdapter ta = new PubsDataSetTableAdapters.QueriesTableAdapter(); // SELECT price FROM titles WITH (UPDLOCK) WHERE title_id=@title_id decimal? price = ta.GetPriceByTitleIdWithUpdlock("BU1032"); decimal newPrice = price.Value + 1; // UPDATE titles SET…

2

ADO 時代の非接続型データアクセス

さてさて、つらつらとさっき Web サイトを巡回してたら、ADO.NET では非接続型データアクセスと呼ばれるデータアクセス手法が新規に導入されたので、ADO 時代のデータアクセスとは考え方が変わっている……という話を見かけたのですが、いやいやそれは違いますよ~;、とツッコミを入れたくなったり。実は ADO の時代には、 接続型データアクセス 非接続型データアクセス の 2 パターンがちゃんとサポートされていた上に、さらに ADO.NET ではできない サーバカーソルの利用 複数テーブルから JOIN したデータに対する非接続型のデータ更新メカニズム までサポートしていたりします。でも、この辺の話って重要な割にはわかりやすくまとめられている資料がない、という問題があって、VB6 や ASP で開発している人でも知らない人の方が多かったりするんですよね。というわけで、このエントリではちょっと昔を振り返って、 ADO 時代の非接続型データアクセスがどんなものだったのか? ADO から ADO.NET になる際に、どのような進化があったのか? を説明してみたいと思います。 [ADO Recordset の基本的なコーディングパターン ] ADO を使う場合、Recordset の開き方は実に多種多様で、様々な「ショートカット的なオープン」が可能になっていました。ところがこの多種多様さゆえに Recordset の正しい開き方がわからなくなっている側面があり、結果として Recordset の誤用が多発していました。 まず、万能かつ基本的な Recordset の開き方は以下のコーディングパターンになります。(他にもさまざまなオープン方法がありますが、それらはいずれもこのコーディングパターンでカバーができます。) Dim con As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset…

2