【プログラミング】ASP.NETのObjectDataSource活用(2)―ADO.NETで作る(2)

ASP.NETにおけるObjectDataSourceコントロールの活用、続きです。前回は、ObjectDataSourceのあらましと、選択メソッド(SelectMethod)を書いてみました。今回は、データバインドコントロールのページング機能に対応するために、取得レコードの範囲を指定できるタイプのメソッドと、その他の必要なメソッドについて書いてみましょう。

【プログラミング】ASP.NETのObjectDataSource活用(1)―ADO.NETで作る(1)

いろいろ調べて試してみましたところ(こればっかし)、ページング機能に対応するためには、ObjectDataSourceに以下の設定が必要とわかりました。

  1. EnablePagingプロパティをTrueに。
  2. startRowIndexParameterName, maximumRowsParameterNameプロパティに適切なパラメータ名を設定する(デフォルトのままでOK)。また、SelectParametersコレクションに対応するパラメータを追加する。
  3. SelectCountMethodプロパティにレコード数取得のためのメソッド名を設定。
  4. SelectMethod, SelectCountMethodプロパティに相当するメソッドの実体を書く。

なんかちょっと複雑ですね。
EnablePagingプロパティをTrueにするのは、ObjectDataSourceがページングに対応していることを示すもので、必須です。このプロパティがFalseのままで、ページングを有効にしたデータバインドコントロールのデータソースとすると、実行時にエラーとなります(Trueにしても、メソッドの実体がなければエラーになりますが)。
startRowIndexParameterName, maximumRowsParameterNameプロパティに設定されているパラメータ名は、取得したいレコード番号(0~)と取得したい最大レコード数を受け取るものとして認識されます。これはつまり、メソッドの実体にこのパラメータを加える必要があるということを意味します。
そして、SelectCountMethodプロパティにレコード数取得のためのメソッド名を設定します。SelectMethodプロパティと同様です。
最後に、SelectMethod, SelectCountMethodプロパティに相当するメソッドの実体を書きます。このうち、SelectMethodについては前回の記事で書いていますが、上記のパラメータを追加して、かつレコード範囲の取得に対応させるために、大幅なコードの書き換えが必要になります。SelectCountMethodは完全な追加です。

メソッドのシグネチャにも注意する点があるのですが、実際のコードを書いていってしまいましょう。最初は、SelectMethodです。

    [DataObjectMethod(DataObjectMethodType.Select)]
    public DbDataReader getPhotoDataReader(int startRowIndex, int maximumRows,
        int category, int direction)
    {

        内容省略。

        db.Open();
        return command.ExecuteReader(CommandBehavior.CloseConnection);
    }

処理内容は省略しておきます。前回の記事のgetPhotoDataReaderのシグネチャと比較すると、引数にstartRowIndex, maximumRowsが追加されているのがわかります。ここでObjectDataSource側のSelectParametersコレクションにこれらの引数が追加されていなければなりません(ウィザードを使うと自動で追加されますが、手動で書き込んでもOKです)。

        <asp:Parameter Name="startRowIndex" Type="Int32" DefaultValue="0" />
        <asp:Parameter Name="maximumRows" Type="Int32" DefaultValue="0" />

くどいようですが、ObjectDataSourceのstartRowIndexParameterName, maximumRowsParameterNameプロパティに設定されている値が、上記のパラメータ名と一致するようにして下さい(ちなみに上記は既定値です)。

次は、レコード数を取得するSelectCountMethodです。

    [DataObjectMethod(DataObjectMethodType.Select)]
    public int getPhotoCount(int startRowIndex, int maximumRows,
        int category, int direction)
    {

        内容省略。

        db.Open();
        int count = (int)command.ExecuteScalar();
        db.Close();
        return count;
    }

こちらも処理内容は省略します。お気付きでしょうが、シグネチャがSelectMethodと同じです。このように、SelectMethodとSelectCountMethodは同じシグネチャを持つ必要があり、SelectParametersコレクションを共有します。また、int型を返すように書く必要があります。

さて、メソッドの形を書いたら、あとは実体(省略された内容)を書くだけです。実は、ここは簡単なようで簡単ではありませんでした。この先も長くなりそうですので、次の回に続けます。

コメント