C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DbDataReader で列が存在することを調べるには


(過去ログ 101 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■60269 / inTopicNo.1)  DbDataReader で列が存在することを調べるには
  
□投稿者/ みきぬ (970回)-(2011/06/25(Sat) 12:50:51)

分類:[.NET 全般] 

.Net Framework 3.5 、言語は C# です。

DB(SQLServer)のテーブルにカラムを追加しました。
しかし環境によってはそのカラムは存在せず、どちらの環境でも動くようにプログラムを直そうとしています。
データの取得には DbDataReader を使っており、その中に指定した名前の列が存在するかしないかで判断しようとしています。

案1:GetOrdinal() を使い、結果が得られるか、IndexOutOfRangeException 例外になるかで判断

→ 例外を使うのでイマイチ。

案2:GetName() を各列でおこない、そこから調べる。

→ 面倒くさい。

何かもう少し美しい方法はないものでしょうか。
# なんで Contains() も HasColumn() もないんだー
引用返信 編集キー/
■60270 / inTopicNo.2)  Re[1]: DbDataReader で列が存在することを調べるには
□投稿者/ かたぎり (50回)-(2011/06/25(Sat) 13:27:15)
SQLserverでしたら、システムカタログにアクセスして、
目的テーブルと列があるかどうかをチェックするのがいいかも

http://msdn.microsoft.com/ja-jp/library/ms189082.aspx
引用返信 編集キー/
■60271 / inTopicNo.3)  Re[2]: DbDataReader で列が存在することを調べるには
□投稿者/ みきぬ (971回)-(2011/06/25(Sat) 13:56:56)
早速の回答ありがとうございます。

後出し要件ですみませんが、クエリは外部設定で定義してあることもあって、
DB側にカラムがあるかどうかとクエリの実行結果にカラムがあるかどうかは、必ずしも一致しません。
なので、DB側の定義を見る方法は使えません。

それと正直、そこまでするような話じゃないと思うのです。
私が無知なだけで、実際は気軽(※この表現が適切かどうか自信ないですが)に使われる方法だったらすみませんが。

引用返信 編集キー/
■60272 / inTopicNo.4)  Re[3]: DbDataReader で列が存在することを調べるには
□投稿者/ かたぎり (51回)-(2011/06/25(Sat) 14:24:17)
んー、そうなのね?

じゃ、GetSchemaTableつかって、
外部定義のSQLで取れる列を事前に把握してチェックかなぁ。

http://support.microsoft.com/kb/310107/ja
http://msdn.microsoft.com/ja-jp/library/0kct2kw6
引用返信 編集キー/
■60273 / inTopicNo.5)  Re[4]: DbDataReader で列が存在することを調べるには
□投稿者/ みきぬ (972回)-(2011/06/25(Sat) 15:31:56)
こんな感じでいけそうです。ありがとうございます。

    System.Data.DataTable table = reader.GetSchemaTable();
    bool existHoge = table.Columns.Contains("Hoge");

    while (reader.Read())
    {
        // ...

        if (existHoge)
        {
            // ...
        }
    }

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -