情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 | 編集
このエントリーをはてなブックマークに追加 Clip to Evernote

DataReaderオブジェクトに、結果の行数を表すプロパティがない理由 このエントリーを含むはてなブックマーク

System.Data.SQLiteを利用していて、"SELECT DISTINCT"を利用して、格納されている値にどのようなものがあるのかを調べようと思いました。

using (SQLiteConnection cnn = new SQLiteConnection("Data Source=data.db"))
using (SQLiteCommand cmd = cnn.CreateCommand())
{
    cnn.Open();

    cmd.CommandText =
        "SELECT DISTINCT ATTRIBUTE_NAME FROM TABLE_NAME";

    using (SQLiteDataReader reader = cmd.ExedcuteReader())
    {
        result = new string[###  謎  ###];
        int i = 0;
        while (reader.Read())
        {
            result[i] = reader[0];
            i++;
        }
    }
}

return result;

コードは以上のようになります。data.dbというSQLiteデータベースファイルのTABLE_NAMEテーブルのATTRIBUTE_NAME属性に含まれている値の一覧を、重複を除いて取得しようとしています。一覧は、SQLiteDataReader型の、readerオブジェクトから得られます。

ここで、結果を配列に格納したいので、まず配列のサイズを決定する必要が出てきます。

すると、readerオブジェクトのLengthプロパティがあるのだろうと思ったりしますが、Lengthはおろか、行数を表すプロパティは一切ありません。つまり、配列のサイズを決定することができないのです。

このことについて調べていると、「Visual C# で OleDbDataReader クラスまたは SqlDataReader クラスを使用するときに、フェッチされるレコード数を示す RecordCount プロパティが存在しない 」というページを発見し、結果の行数をreaderオブジェクトから取得することはできないということが分かりました。

そのページには、SELECT COUNT(*)を利用するようにと記述されています。そこで、その通りに、上記のプログラムを書き直すと、以下のようになります。

using (SQLiteConnection cnn = new SQLiteConnection("Data Source=data.db"))
using (SQLiteCommand cmd = cnn.CreateCommand())
{
    cnn.Open();

    cmd.CommandText =
        "SELECT COUNT(*)" +
        "FROM (" +
        "SELECT DISTINCT ATTRIBUTE_NAME FROM TABLE_NAME" +
        ")";

    int resultCount = int.Parse(cmd.ExecuteScalar().ToString()); 

    cmd.CommandText =
        "SELECT DISTINCT ATTRIBUTE_NAME FROM TABLE_NAME";

    using (SQLiteDataReader reader = cmd.ExedcuteReader())
    {
        result = new string[resultCount];
        int i = 0;
        while (reader.Read())
        {
            result[i] = reader[0];
            i++;
        }
    }
}

return result;

ちなみに、DataReaderの、FieldCountは、行数ではなく、結果の列数を表すプロパティです。今回の例では、必ず1になっているはずです。

データベース | コメント:0 | トラックバック:0 | 編集
このエントリーをはてなブックマークに追加 Clip to Evernote

この記事のコメント

コメントの投稿 エントリの新旧に関わらず、極力18時間中に返信します。














この記事のトラックバック

トラックバックURL:
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。