<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>ADO.NET</title><link>http://blogs.wankuma.com/trapemiya/category/372.aspx</link><description>ADO.NET</description><managingEditor>trapemiya &lt;miya.hideki@nifty.com&gt;</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>サポート技術情報のRSSって新着サポート技術情報だけになっちゃったんだね？</title><link>http://blogs.wankuma.com/trapemiya/archive/2008/07/29/150792.aspx</link><pubDate>Tue, 29 Jul 2008 12:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2008/07/29/150792.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/150792.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2008/07/29/150792.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/150792.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/150792.aspx</trackback:ping><description>&lt;P&gt;久しぶりにサポート技術情報のRSS一覧を見に行ったら見つからない。あれ？どこだっけな？と探すこと小一時間。その間に気になる記事とかつまみ食いしてたこともありますが・・・。&lt;BR&gt;あまりにも見つからないので検索対象を広げたところ、Jittaさんのブログ発見。&lt;/P&gt;
&lt;P&gt;マイクロソフト サポート情報の RSS フィード &lt;BR&gt;&lt;A href="http://blogs.wankuma.com/jitta/archive/2008/07/17/149421.aspx"&gt;http://blogs.wankuma.com/jitta/archive/2008/07/17/149421.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;あれ～、無くなっちゃったのね。なんでだろー。&lt;BR&gt;とりあえずJittaさんのおかげで解決。多謝。&lt;BR&gt;たぶんこのJittaさんの記事、一度はタイトルだけは見てるはずなんだけど、さくっと通り過ぎてたなぁ。&lt;BR&gt;それにしても直近でナイスな記事でした。この記事が無かったらお昼ご飯が遅れてたもの。&lt;/P&gt;
&lt;P&gt;というわけで現在正式に表に出ているのは、ＭＳＤＮホームのトップページにあるサポート技術情報のRSSだけかな？これはどうも新着サポート技術情報のRSSのようです。&lt;/P&gt;
&lt;P&gt;じゃっ、お昼ごはんということで。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/150792.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>ネストしたトランザクションの処理</title><link>http://blogs.wankuma.com/trapemiya/archive/2008/01/31/120250.aspx</link><pubDate>Thu, 31 Jan 2008 21:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2008/01/31/120250.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/120250.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2008/01/31/120250.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/120250.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/120250.aspx</trackback:ping><description>&lt;P&gt;ネストしたトランザクションにおいては、内側のトランザクションでは常にCOMMITし、外側のトランザクションで内側のトランザクションからの通知（戻り値など）によって、COMMITするかROLL BACKすれば良いのか。これによって、ネストしたトランザクション全体が制御されることになる。&lt;/P&gt;
&lt;P&gt;「EXECUTE 後のトランザクション数は、 COMMIT TRAN または ROLLBACK TRAN ステートメントに間違いがあることを示しています。以前の数 = 1、現在の数 = 0 です。」&lt;/P&gt;
&lt;P&gt;というエラーメッセージが出て焦った(^^;&lt;/P&gt;
&lt;P&gt;以下のページに多謝　m(_ _)m&lt;/P&gt;
&lt;P&gt;SQL Server 2000でのコネクション／トランザクション問題&lt;BR&gt;&lt;A href="http://d.hatena.ne.jp/PoohKid/20060608/p2"&gt;http://d.hatena.ne.jp/PoohKid/20060608/p2&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/120250.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>TableAdapterはストアドプロシージャのラッパーのように使える。</title><link>http://blogs.wankuma.com/trapemiya/archive/2006/08/18/36655.aspx</link><pubDate>Fri, 18 Aug 2006 15:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2006/08/18/36655.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/36655.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2006/08/18/36655.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/36655.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/36655.aspx</trackback:ping><description>&lt;P&gt;TableAdapterによって、ストアドプロシージャが簡単に使えるようになりましたね。&lt;BR&gt;TableAdapterのウイザードによってストアドプロシージャを簡単に作成できるようになりましたし、おまけにデータベースに自動で配置までしてくれます。&lt;BR&gt;既存のストアドプロシージャを利用する場合でも、パラメータオブジェクトを自動で作ってくれて、Fillという関数という形で提供してくれます。&lt;BR&gt;アプリケーションではこのFillという関数にパラメータとして値を与えるだけです。&lt;BR&gt;う～ん、楽ちんです。&lt;BR&gt;何がいいって、パラメータオブジェクトをアプリケーションで面倒みなくていいのが、すごく良い。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/36655.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>CommandCollection[0]とはおさらばだ。</title><link>http://blogs.wankuma.com/trapemiya/archive/2006/08/16/36464.aspx</link><pubDate>Wed, 16 Aug 2006 19:04:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2006/08/16/36464.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/36464.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2006/08/16/36464.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/36464.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/36464.aspx</trackback:ping><description>&lt;P&gt;.NET2.0になってからTableAdapterというのもが増えた。これはこれで非常に便利なものである。しかし、問題がある。動的にＳＱＬ文を発行したい場合だ。特に検索系において、動的にwhere句を変えたい場合、どうやれば良いのだろうか？&lt;/P&gt;
&lt;P&gt;これについては２つあると思う。一つは、partial classでパブリックなCommandCollectionを定義して、それをプログラムから利用する方法。もう一つは、Fillをオーバーライドする方法だ。しかし、いずれにしても弱点がある。CommandCollection[0]という風に、インデックスでアクセスする方法でしか、SqlCommandが得られないということである。これはあまりにも気持ち悪い。しかも、インデックスの順番なんか保障されていない。&lt;BR&gt;なので、上の二つの方法を採用することはあきらめた。&lt;/P&gt;
&lt;P&gt;では、どのようにしてアクセスしようか？&lt;/P&gt;
&lt;P&gt;結果的には、全てストアドプロシージャで対応することにした。SQL文やwhere句の動的な作成も、全てストアドプロシージャで行うことにした。&lt;/P&gt;
&lt;P&gt;元々、ストアドプロシージャを使っておけばいろいろと気にしなくても良い。プログラムでＳＱＬ文を組み立てる場合、例えば'90年のように、「'」を含む文字列を入力されたらどうなるだろう？　それだけで、ＳＱＬ文は動かなくなってしまう。この点、ストアドプロシージャのパラメータで渡しておけば安心だ。&lt;/P&gt;
&lt;P&gt;というわけで、CommandCollection[0]とはおさらばだ。&lt;/P&gt;
&lt;P&gt;＃それにしてもなぜTableAdapterはCommandCollectionを使いやすく公開していないのだろうか？ついでにDataAdapterもである。Fillはvirtualなのに、DataAdapterはprivateで定義してある。FillをオーバーライドしたらDataAdaperにアクセスできれば便利なんで、DataAdapterはprotectedで定義して欲しかった。もっとも、partial classでDataAdapterをpublicで公開してあげればFill内で使えるんだけど、手間なんですよね。&lt;/P&gt;
&lt;P&gt;＃何年か前にわんくま中さんが、何でもストアドって言ってたけど、徐々に身にしみてくるなぁ。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/36464.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>ADO.NETの新しい情報（英語）</title><link>http://blogs.wankuma.com/trapemiya/archive/2006/06/19/30990.aspx</link><pubDate>Mon, 19 Jun 2006 14:22:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2006/06/19/30990.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/30990.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2006/06/19/30990.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/30990.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/30990.aspx</trackback:ping><description>&lt;P&gt;ADO.NETの新しい情報が出ましたね。&lt;BR&gt;読んでなくて紹介だけですが・・・(^^;&lt;/P&gt;
&lt;P&gt;Data Access and Storage&lt;BR&gt;&lt;A href="http://msdn.microsoft.com/data/"&gt;http://msdn.microsoft.com/data/&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;The ADO.NET Entity Framework Overview (June 2006)&lt;BR&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=E9BA57AA-2A27-4658-AD04-4380A2DF836C&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=E9BA57AA-2A27-4658-AD04-4380A2DF836C&amp;amp;displaylang=en&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Next Generation Data Access (June 2006)&lt;BR&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=A917C7E1-D86C-4881-B984-FE9F490F9FB9&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=A917C7E1-D86C-4881-B984-FE9F490F9FB9&amp;amp;displaylang=en&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/30990.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>DataAdapterやSqlCommandたちは代打の切り札？？</title><link>http://blogs.wankuma.com/trapemiya/archive/2006/04/17/22530.aspx</link><pubDate>Mon, 17 Apr 2006 10:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2006/04/17/22530.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/22530.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2006/04/17/22530.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/22530.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/22530.aspx</trackback:ping><description>&lt;P&gt;VS2005になってから、DataAdapterだのSqlCommandなどは、ツールボックスにデフォで表示されないようになりました。一見すると、これらはレガシーなんでもう使うな、下位互換のために用意されているという印象を受けがちですが、私はそうは思っていません。全然、レガシーなんかじゃないと思います。現にTableAdapterなどの内部できっちり使われているのですから。&lt;BR&gt;私はこう考えています。VS2005をより広く使ってもらうために、またより多くの初心者にやさしいように、まずは簡単に使ってもらえるように、TableAdapterやSqlCommandを隠したのだと。急遽、Express無料配布になったことにも、VS2005をより多くの人に広めようとする戦略が感じられます。もちろん、中上級者にとっても、工数が減らせるTableAdapterやSqlDataSourceは、即レギュラー入りの頼りになるメンバーでしょう。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;しかし、いざという時の、ここぞという場合に渋い仕事をしてくれる、頼りになる代打の切り札がいます。それが、DataAdapterやSqlCommandなどだと思います。決してそれらはレガシーではなく、まだまだ現役なんです。だからこそ、初心者のみなさんには、TableAdapterなり、SqlDataSourceなりを覚えたら、次は素のADO.NETであるDataAdapterやSqlCommandも勉強してもらいたいと思います。きっと、あなたのVS2005というチームは、勝負強いチームになるでしょう。ここぞと思ったら、ツールボックスからSqlCommandを代打に送りましょう。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/22530.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>【小ネタ】Ｃ＃からストアドプロプロシージャを実行していて、どこの行でエラーが発生しているかを簡単に知る方法</title><link>http://blogs.wankuma.com/trapemiya/archive/2006/02/24/21505.aspx</link><pubDate>Fri, 24 Feb 2006 19:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2006/02/24/21505.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/21505.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2006/02/24/21505.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/21505.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/21505.aspx</trackback:ping><description>&lt;P&gt;返されたExceptionオブジェクトのGetBaseException()を見てみよう。そこにエラーが発生した番号や、エラーコード、エラーメッセージなどを見ることができる。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/21505.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>ストアドプロシージャでレコードの存在チェックをせずに追加・更新する。</title><link>http://blogs.wankuma.com/trapemiya/archive/2006/02/23/21482.aspx</link><pubDate>Thu, 23 Feb 2006 18:53:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2006/02/23/21482.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/21482.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2006/02/23/21482.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/21482.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/21482.aspx</trackback:ping><description>SQLサーバーのテーブルにおいて、ほとんどの場合はレコードの追加であるが、ごくまれに更新があるかもしれないといった場合、いちいちレコードの存在チェックをしてから、レコードの追加または更新をするのは無駄である。これが１件ぐらいの処理であればいいが、数万件の処理ということになると、かなり無駄に感じる。&lt;BR&gt;そこでストアドプロシージャを以下のようにしてみた。hoge1にはUNIQUE KEY制約を付けてある。&lt;BR&gt;&lt;BR&gt;
&lt;DIV class=code&gt;&lt;PRE&gt;　　insert into table1 (hoge1, hoge2) values (@hoge1, @hoge2)

　　if @@ERROR = 0 GOTO skip

　　update table1 hoge2=@hoge2 where hoge1 = @hoge1

skip:

&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR&gt;確かにこれで思った通りに動いている。しかし、C#からこのストアドプロシージャを呼ぶと、UNIQUE KEY制約違反の例外が発生する。しょうがないので、以下のようにして逃げた。&lt;BR&gt;&lt;BR&gt;
&lt;DIV class=code&gt;&lt;PRE&gt;try
{
　　　sqlCommand1.ExecuteNonQuery(); 
}
catch(System.Data.SqlClient.SqlException ex)
{
　　　if (ex.Number != 2627) throw ex; //2627は、UNIQUE KEY制約違反
}
&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR&gt;＃何か指摘があれば、コメントをお願いします。(^^;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/21482.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>trapemiya &lt;miya.hideki@nifty.com&gt;</dc:creator><title>DataReaderのパフォーマンスを上げる。</title><link>http://blogs.wankuma.com/trapemiya/archive/2006/01/18/20694.aspx</link><pubDate>Wed, 18 Jan 2006 17:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/trapemiya/archive/2006/01/18/20694.aspx</guid><wfw:comment>http://blogs.wankuma.com/trapemiya/comments/20694.aspx</wfw:comment><comments>http://blogs.wankuma.com/trapemiya/archive/2006/01/18/20694.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/trapemiya/comments/commentRss/20694.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/trapemiya/services/trackbacks/20694.aspx</trackback:ping><description>&lt;P&gt;大量にデータベースを読んで、大量にデータベースに書き戻す処理があるんですが、それをDataReaderでバッチ処理のようにやっています。パフォーマンスを上げようと思って調べていたんですが、&lt;/P&gt;
&lt;P&gt;int hoge = (int)myDataReader["hogehoge"];&lt;/P&gt;
&lt;P&gt;と書くなら、以下のようにGetInt32のようなGetxxxシリーズを使った方が、パフォーマンス的に良いようですね。なぜなら、毎回hogehogeの列名で探しに行くからだそうです。&lt;/P&gt;
&lt;P&gt;int hoge = myDataReader.GetInt32(1);&lt;/P&gt;
&lt;P&gt;ここで気になるのは、直接インデックスを書いているんでその保守性ですが、DataReaderを使って値を読むような場合は、大抵自分でselect文を書いて読んでいるだろうから、将来select文が変わってインデックスがずれることはあまり心配しなくてもいいのかもしれません。&lt;BR&gt;どうしても気になるなら、GetOrdinalを使えば、列名からインデックスが得られるので、以下のようにしておけば良いでしょう。&lt;/P&gt;
&lt;DIV class=code&gt;&lt;PRE&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; &lt;FONT color=#000000&gt;index&lt;/FONT&gt; = &lt;FONT color=#000000&gt;myDataReader&lt;/FONT&gt;.&lt;FONT color=#000000&gt;GetOrdinal&lt;/FONT&gt;(&lt;FONT color=#000000&gt;"hogehoge"&lt;/FONT&gt;);

&lt;FONT color=#0000ff&gt;while&lt;/FONT&gt; (&lt;FONT color=#000000&gt;myDataReader&lt;/FONT&gt;.&lt;FONT color=#000000&gt;Read&lt;/FONT&gt;())
{
    &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; &lt;FONT color=#000000&gt;hoge&lt;/FONT&gt; = &lt;FONT color=#000000&gt;myDataReader&lt;/FONT&gt;.&lt;FONT color=#000000&gt;GetInt32&lt;/FONT&gt;(&lt;FONT color=#000000&gt;index&lt;/FONT&gt;);
        ・
        ・
        ・
}
&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;あと、以下のページも参考になります。&lt;/P&gt;
&lt;P&gt;チェックリスト: ADO.NET パフォーマンス&lt;BR&gt;&lt;A href="http://www.microsoft.com/japan/msdn/enterprise/pag/scalenetcheck01.asp"&gt;http://www.microsoft.com/japan/msdn/enterprise/pag/scalenetcheck01.asp&lt;/A&gt;&lt;BR&gt;&lt;/P&gt;
&lt;DIV&gt;&lt;/DIV&gt;&lt;img src ="http://blogs.wankuma.com/trapemiya/aggbug/20694.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>