source: default/framework/trunk/WebLibrary/Sources/UI/WebControls/CommonDbDataSource.cs @ 1669

このファイルの 1669 以降における最終更新内容1669 で hizuya@… が 6週前 に更新しました
  • コントロールIDを指定するプロパティに IDReferenceProperty 属性を付与。
ファイルサイズ: 36.5 KB
 
1// ----------------------------------------------------------------------------
2// <copyright company="F.C. Soft., Inc.">
3//   Copyright(c) F.C. Soft., Inc.  All rights reserved.
4// </copyright>
5// <license>
6//   Licensed to F.C. Soft., Inc. (FCSoft) under one or more contributor
7//   license agreements.  See the NOTICE file distributed with this work for
8//   additional information regarding copyright ownership.  FCSoft licenses
9//   this file to You under the Apache License, Version 2.0 (the "License");
10//   you may not use this file except in compliance with the License.  You
11//   may obtain a copy of the License at
12//
13//     http://www.apache.org/licenses/LICENSE-2.0
14//
15//   Unless required by applicable law or agreed to in writing, software
16//   distributed under the License is distributed on an "AS IS" BASIS,
17//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18//   See the License for the specific language governing permissions and
19//   limitations under the License.
20// </license>
21// ----------------------------------------------------------------------------
22
23namespace FCSoft.SilverFrost.Framework.Web.UI.WebControls
24{
25    using System;
26    using System.Collections;
27    using System.ComponentModel;
28    using System.Diagnostics;
29    using System.Web.UI;
30    using System.Web.UI.WebControls;
31    using FCSoft.SilverFrost.Framework.Data;
32    using FCSoft.SilverFrost.Framework.Web.Properties;
33    using Page = FCSoft.SilverFrost.Framework.Web.UI.Page;
34
35
36    /// <summary>
37    /// 共通 DB プロバイダを元にしたデータソースコントロールです。
38    /// </summary>
39    /// <remarks>
40    /// <para>
41    /// このデータソースコントロールは、共通 DB (<c>FCSoft.SilverFrost.Framework.Data</c>)
42    /// 機能を元にしています。
43    /// データを取得するために <see cref="ConnectionName"/> プロパティに指定された接続先設定名と
44    /// <see cref="SelectStatementName"/> プロパティに指定された SQL ステートメントブロック名を使用します。
45    /// <see cref="ConnectionName"/> プロパティを元に、このコントロールが配置されているページで
46    /// 定義されている接続の中からデータベースコネクションを取得します。
47    /// このコントロールは <see cref="FCSoft.SilverFrost.Framework.Web.UI.Page"/>
48    /// クラス、またはサブクラスにのみ配置可能です。
49    /// </para>
50    /// <para>
51    /// それ以外の方法として、<see cref="Connection"/> プロパティに
52    /// 実際に使用するコネクションを指定する方法もあります。
53    /// また、<see cref="Transaction"/> プロパティを指定して
54    /// 任意のトランザクションにてデータ取得を行うことも出来ます。
55    /// ただしこれらの場合、自動データバインドの機能を使用すると
56    /// 任意のタイミングでデータ取得が発生するため、
57    /// 有効なコネクション、トランザクションのスコープ内で
58    /// <see cref="System.Web.UI.Control.DataBind()"/> メソッドを
59    /// 明示的に呼び出す必要があります。
60    /// </para>
61    /// <para>
62    /// スマートなページング機能に対応するためには
63    /// <see cref="PagerStartParameterName"/>、<see cref="PagerEndParameterName"/>
64    /// プロパティを指定する必要があります。
65    /// これらのプロパティは SQL ステートメントのパラメータ名で、
66    /// ページに対応するの最初と最後の行番号が指定されます。
67    /// SQL ステートメントは、このプロパティによって指定された範囲の行を返すように
68    /// 調整する必要があります。
69    /// 注意点として、範囲指定がされない場合に、これらのパラメータが設定されません。
70    /// そのため、SQL テンプレート内ではパラメータの有無によって
71    /// SQL ステートメントが調整されるようにする必要があります。
72    /// </para>
73    /// <example>
74    /// <para>
75    /// ASPX の例
76    /// </para>
77    /// <code>
78    /// &lt;sfc:CommonDbDataSource ID="DataSource" runat="server"
79    ///     ConnectionName="DatabaseName"
80    ///     SelectStatementName="UserSelect"
81    ///     PagerStartParameterName="startRows"
82    ///     PagerEndParameterName="endRows" /&gt;
83    /// </code>
84    /// <para>
85    /// SQL テンプレートの例
86    /// </para>
87    /// <code>
88    /// UserSelect =
89    ///     SELECT
90    ///         userId,
91    ///         userName
92    ///     FROM
93    ///         user
94    ///     WHERE
95    ///         status = '1'
96    ///         ${UserSelect_Start:@}
97    ///         ${UserSelect_End:@}
98    /// #
99    /// UserSelect_Start = AND @startRows &lt;= ROWNUM
100    /// UserSelect_End   = AND ROWNUM &lt;= @endRows
101    /// </code>
102    /// </example>
103    /// <para>
104    /// 汎用的にスマートなページング機能に対応するため
105    /// <see cref="CompositeStatementName"/> プロパティを
106    /// 指定することが出来ます。
107    /// このプロパティは、<see cref="SelectStatementName"/> で
108    /// 指定した SQL ステートメントを、スマートなページング機能に対応するための
109    /// SQL ステートメントにラップする SQL ステートメントブロック名を指定します。
110    /// この機能は、多くのデータベースでサポートされている集計関数を使用して
111    /// SQL をラップすることを前提にしているため、<see cref="OrderStatementName"/>
112    /// プロパティで並べ替え部分 (<c>ORDER BY</c> 以降) の指定をする必要があります。
113    /// この場合、<see cref="SelectStatementName"/> では
114    /// 並べ替え部分を指定することは出来ません。
115    /// <see cref="SelectStatementName"/> と <see cref="OrderStatementName"/>
116    /// の SQL ステートメントは、<see cref="CompositeStatementName"/> プロパティで
117    /// 指定した SQL ステートメントブロックにある
118    /// <see cref="CompositeSelectTargetStatementName"/>、
119    /// <see cref="CompositeOrderTargetStatementName"/> プロパティで指定した
120    /// 変数部分に埋め込まれます。
121    /// </para>
122    /// <para>
123    /// これらの機能を使用するために、集計関数を使用した標準的な仕組みが用意されています。
124    /// SQL テンプレートで
125    /// <c>resource:FCSoft.SilverFrost.Framework.Web/FCSoft.SilverFrost.Framework.Web.Resources.Data.CommonDbDataSource.st</c>
126    /// をインクルードし、
127    /// <see cref="CompositeStatementName"/> プロパティに <c>SilverFrost.PagerComposite</c>、
128    /// <see cref="CompositeSelectTargetStatementName"/> プロパティに <c>SilverFrost.PagerComposite.Select</c>、
129    /// <see cref="CompositeOrderTargetStatementName"/> プロパティに <c>SilverFrost.PagerComposite.Order</c>、
130    /// <see cref="PagerStartParameterName"/> プロパティに <c>SilverFrost_Pager_Start</c>、
131    /// <see cref="PagerEndParameterName"/> プロパティに <c>SilverFrost_Pager_End</c>
132    /// を指定します。
133    /// </para>
134    /// <example>
135    /// <para>
136    /// ASPX の例
137    /// </para>
138    /// <code>
139    /// &lt;sfc:CommonDbDataSource ID="DataSource" runat="server"
140    ///     ConnectionName="DatabaseName"
141    ///     SelectStatementName="UserSelect"
142    ///     OrderStatementName="UserSelect_Order"
143    ///     CompositeStatementName="SilverFrost.PagerComposite"
144    ///     CompositeSelectTargetStatementName="SilverFrost.PagerComposite.Select"
145    ///     CompositeOrderTargetStatementName="SilverFrost.PagerComposite.Order"
146    ///     PagerStartParameterName="SilverFrost_Pager_Start"
147    ///     PagerEndParameterName="SilverFrost_Pager_End" /&gt;
148    /// </code>
149    /// <para>
150    /// SQL テンプレートの例
151    /// </para>
152    /// <code>
153    /// @include resource:FCSoft.SilverFrost.Framework.Web/FCSoft.SilverFrost.Framework.Web.Resources.Data.CommonDbDataSource.st
154    /// #
155    /// UserSelect =
156    ///     SELECT
157    ///         userId,
158    ///         userName
159    ///     FROM
160    ///         user
161    ///     WHERE
162    ///         status = '1'
163    /// #
164    /// UserSelect_Order = userId
165    /// </code>
166    /// </example>
167    /// </remarks>
168    [DefaultProperty("SelectStatementName")]
169    [ParseChildren(true)]
170    [PersistChildren(false)]
171    [WebDescription("Description_CommonDbDataSource")]
172    [ControlInitializerTarget]
173    public class CommonDbDataSource :
174        DataSourceControl
175    {
176        /// <summary>
177        /// デフォルトのビュー名。
178        /// </summary>
179        private const string DefaultViewName = "DefaultView";
180
181
182        /// <summary>
183        /// コネクション。
184        /// </summary>
185        [DebuggerBrowsable(DebuggerBrowsableState.Never)]
186        private ICommonDbConnection connection;
187
188        /// <summary>
189        /// トランザクション。
190        /// </summary>
191        [DebuggerBrowsable(DebuggerBrowsableState.Never)]
192        private ICommonDbTransaction transaction;
193
194        /// <summary>
195        /// ビュー名のコレクション。
196        /// </summary>
197        private ICollection viewNames;
198
199        /// <summary>
200        /// データソースビュー。
201        /// </summary>
202        private CommonDbDataSourceView view;
203
204
205        /// <summary>
206        /// インスタンスを作成します。
207        /// </summary>
208        public CommonDbDataSource()
209        {
210            ControlInitializer.ApplyProperties(this);
211        }
212
213
214        /// <summary>
215        /// 接続先名を取得または設定します。
216        /// </summary>
217        /// <value>
218        /// 接続先名を表す文字列。
219        /// 既定値は空の文字列 ("") です。
220        /// </value>
221        [Themeable(false)]
222        [DefaultValue("")]
223        [WebCategory("Data")]
224        [WebDescription("Description_ConnectionName")]
225        public virtual string ConnectionName
226        {
227            get
228            {
229                return GetView().ConnectionName;
230            }
231
232            set
233            {
234                GetView().ConnectionName = value;
235            }
236        }
237
238        /// <summary>
239        /// データベースコネクションを取得または設定します。
240        /// </summary>
241        /// <value>
242        /// データベースコネクション。
243        /// 既定値は <see langword="null"/> 参照です。
244        /// </value>
245        [Browsable(false)]
246        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
247        public virtual ICommonDbConnection Connection
248        {
249            get
250            {
251                return connection;
252            }
253
254            set
255            {
256                connection = value;
257            }
258        }
259
260        /// <summary>
261        /// データベーストランザクションを取得または設定します。
262        /// </summary>
263        /// <value>
264        /// データベーストランザクション。
265        /// 既定値は <see langword="null"/> 参照です。
266        /// </value>
267        /// <remarks>
268        /// トランザクションが設定されている場合は、このトランザクションが優先して使用されます。
269        /// 自動データバインドの場合、任意のタイミングでトランザクションが使用されるため、
270        /// 設定してあるトランザクションが有効ではないかもしれません。
271        /// これを避けるため、<see cref="Transaction"/> プロパティを設定した場合、
272        /// トランザクションのスコープ内で <see cref="System.Web.UI.Control.DataBind()"/>
273        /// メソッドを明示的に呼び出す必要があります。
274        /// </remarks>
275        [Browsable(false)]
276        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
277        public virtual ICommonDbTransaction Transaction
278        {
279            get
280            {
281                return transaction;
282            }
283
284            set
285            {
286                transaction = value;
287            }
288        }
289
290        /// <summary>
291        /// ページング用にデータ取得開始行番号を指定するために
292        /// 使用するパラメータ名を取得または設定します。
293        /// </summary>
294        /// <value>
295        /// パラメータ名。
296        /// 既定値は空の文字列 ("") です。
297        /// 空の文字列を指定した場合、開始行番号は指定されなくなります。
298        /// </value>
299        [Themeable(false)]
300        [DefaultValue("")]
301        [WebCategory("Data")]
302        [WebDescription("Description_CommonDbDataSource_PagerStartParameterName")]
303        public virtual string PagerStartParameterName
304        {
305            get
306            {
307                return GetView().PagerStartParameterName;
308            }
309
310            set
311            {
312                GetView().PagerStartParameterName = value;
313            }
314        }
315
316        /// <summary>
317        /// ページング用にデータ取得終了行番号を指定するために
318        /// 使用するパラメータ名を取得または設定します。
319        /// </summary>
320        /// <value>
321        /// パラメータ名。
322        /// 既定値は空の文字列 ("") です。
323        /// 空の文字列を指定した場合、開始行番号は指定されなくなります。
324        /// </value>
325        [Themeable(false)]
326        [DefaultValue("")]
327        [WebCategory("Data")]
328        [WebDescription("Description_CommonDbDataSource_PagerEndParameterName")]
329        public virtual string PagerEndParameterName
330        {
331            get
332            {
333                return GetView().PagerEndParameterName;
334            }
335
336            set
337            {
338                GetView().PagerEndParameterName = value;
339            }
340        }
341
342        /// <summary>
343        /// SQL ステートメントブロック名に対応する SQL テンプレートのパスを
344        /// 取得または設定します。
345        /// </summary>
346        /// <value>
347        /// SQL テンプレートのパス。
348        /// 既定値は空の文字列 ("") です。
349        /// 空の文字列の場合、使用されるコネクションに設定されている
350        /// SQL テンプレートが使用されます。
351        /// </value>
352        [Themeable(false)]
353        [DefaultValue("")]
354        [WebCategory("Data")]
355        [WebDescription("Description_SqlTemplatePath")]
356        public virtual string SqlTemplatePath
357        {
358            get
359            {
360                return GetView().SqlTemplatePath;
361            }
362
363            set
364            {
365                GetView().SqlTemplatePath = value;
366            }
367        }
368
369        /// <summary>
370        /// データを並び替えるために <see cref="OrderStatementName"/>
371        /// プロパティを指定した場合に、
372        /// <see cref="SelectStatementName"/> プロパティで指定した
373        /// SQL ステートメントを結合させるために使用される
374        /// SQL ステートメントブロック名を取得または設定します。
375        /// </summary>
376        /// <value>
377        /// SQL ステートメントブロック名。
378        /// 既定値は空の文字列 ("") です。
379        /// <see cref="OrderStatementName"/> が指定された場合、
380        /// このプロパティも指定する必要があります。
381        /// </value>
382        [Themeable(false)]
383        [DefaultValue("")]
384        [WebCategory("Data")]
385        [WebDescription("Description_CommonDbDataSource_CompositeStatementName")]
386        public virtual string CompositeStatementName
387        {
388            get
389            {
390                return GetView().CompositeStatementName;
391            }
392
393            set
394            {
395                GetView().CompositeStatementName = value;
396            }
397        }
398
399        /// <summary>
400        /// <see cref="CompositeStatementName"/> で指定した
401        /// SQL ステートメントブロックに対して、
402        /// <see cref="SelectStatementName"/> で指定した
403        /// SQL ステートメントブロックを埋め込むときに使用する
404        /// SQL ステートメントブロック名です。
405        /// </summary>
406        /// <value>
407        /// SQL ステートメントブロック名。
408        /// 既定値は空の文字列 ("") です。
409        /// <see cref="CompositeStatementName"/> が指定された場合、
410        /// このプロパティも指定する必要があります。
411        /// </value>
412        [Themeable(false)]
413        [DefaultValue("")]
414        [WebCategory("Data")]
415        [WebDescription("Description_CommonDbDataSource_CompositeSelectTargetStatementName")]
416        public virtual string CompositeSelectTargetStatementName
417        {
418            get
419            {
420                return GetView().CompositeSelectTargetStatementName;
421            }
422
423            set
424            {
425                GetView().CompositeSelectTargetStatementName = value;
426            }
427        }
428
429        /// <summary>
430        /// <see cref="CompositeStatementName"/> で指定した
431        /// SQL ステートメントブロックに対して、
432        /// <see cref="OrderStatementName"/> で指定した
433        /// SQL ステートメントブロックを埋め込むときに使用する
434        /// SQL ステートメントブロック名です。
435        /// </summary>
436        /// <value>
437        /// SQL ステートメントブロック名。
438        /// 既定値は空の文字列 ("") です。
439        /// <see cref="OrderStatementName"/> が指定された場合、
440        /// このプロパティも指定する必要があります。
441        /// </value>
442        [Themeable(false)]
443        [DefaultValue("")]
444        [WebCategory("Data")]
445        [WebDescription("Description_CommonDbDataSource_CompositeOrderTargetStatementName")]
446        public virtual string CompositeOrderTargetStatementName
447        {
448            get
449            {
450                return GetView().CompositeOrderTargetStatementName;
451            }
452
453            set
454            {
455                GetView().CompositeOrderTargetStatementName = value;
456            }
457        }
458
459        /// <summary>
460        /// データを取得する際に使用する
461        /// SQL ステートメントブロック名を取得または設定します。
462        /// </summary>
463        /// <value>
464        /// データを取得するための SQL ステートメントブロック名。
465        /// 既定値は空の文字列 ("") です。
466        /// </value>
467        [Themeable(false)]
468        [DefaultValue("")]
469        [WebCategory("Data")]
470        [WebDescription("Description_CommonDbDataSource_SelectStatementName")]
471        public virtual string SelectStatementName
472        {
473            get
474            {
475                return GetView().SelectStatementName;
476            }
477
478            set
479            {
480                GetView().SelectStatementName = value;
481            }
482        }
483
484        /// <summary>
485        /// データを取得する際にデータの並びかえを行うために使用する
486        /// SQL ステートメントブロック名を取得または設定します。
487        /// </summary>
488        /// <value>
489        /// データの並び替えをするための SQL ステートメントブロック名。
490        /// 既定値は空の文字列 ("") です。
491        /// </value>
492        /// <remarks>
493        /// <para>
494        /// このプロパティで使用できる SQL ステートメントは、
495        /// <see cref="CompositeStatementName"/> プロパティで指定された
496        /// SQL ステートメントに左右されます。
497        /// </para>
498        /// <para>
499        /// 標準の実装の場合、ここで指定された SQL ステートメントは、
500        /// <c>ORDER BY</c> の後ろに展開されます。
501        /// また、ページング用の SQL ステートメントに展開された場合、
502        /// テーブル修飾子が解決できなくなるため、
503        /// 必ずテーブル修飾子を付けないフィールド名のみを指定する必要があります。
504        /// </para>
505        /// <example>
506        /// <para>
507        /// 正しい例
508        /// </para>
509        /// <code>
510        /// name, age desc, office
511        /// </code>
512        /// </example>
513        /// <example>
514        /// <para>
515        /// 正しくない例
516        /// </para>
517        /// <code>
518        /// t.name, user.age
519        /// </code>
520        /// </example>
521        /// </remarks>
522        [Themeable(false)]
523        [DefaultValue("")]
524        [WebCategory("Data")]
525        [WebDescription("Description_CommonDbDataSource_OrderStatementName")]
526        public virtual string OrderStatementName
527        {
528            get
529            {
530                return GetView().OrderStatementName;
531            }
532
533            set
534            {
535                GetView().OrderStatementName = value;
536            }
537        }
538
539        /// <summary>
540        /// データを取得する際にデータの並びかえを行うために使用する
541        /// SQL ステートメントブロック名を取得するためのコントロールを取得または設定します。
542        /// </summary>
543        /// <value>
544        /// データの並び替えをするための SQL ステートメントブロック名を取得するコントロール。
545        /// 既定値は空の文字列 ("") です。
546        /// </value>
547        [IDReferenceProperty]
548        [Themeable(false)]
549        [DefaultValue("")]
550        [WebCategory("Data")]
551        [WebDescription("Description_CommonDbDataSource_ControlToGetOrderStatementName")]
552        public virtual string ControlToGetOrderStatementName
553        {
554            get
555            {
556                return GetView().ControlToGetOrderStatementName;
557            }
558
559            set
560            {
561                GetView().ControlToGetOrderStatementName = value;
562            }
563        }
564
565        /// <summary>
566        /// <see cref="CommonDbDataSource"/> コントロールに関連付けられた
567        /// <see cref="CommonDbDataSourceView"/> オブジェクトから、
568        /// <see cref="SelectStatementName"/> プロパティで使用される
569        /// ステートメントブロックを格納するパラメータ コレクションを取得します。
570        /// </summary>
571        /// <value>
572        /// <see cref="SelectStatementName"/> プロパティによって使用される
573        /// ステートメントブロックを格納している <see cref="ParameterCollection"/>。
574        /// </value>
575        [Themeable(false)]
576        [DefaultValue(null)]
577        [PersistenceMode(PersistenceMode.InnerProperty)]
578        [MergableProperty(false)]
579        [WebCategory("Data")]
580        [WebDescription("Description_CommonDbDataSource_StatementBlocks")]
581        public ParameterCollection SelectStatementBlocks
582        {
583            get
584            {
585                return GetView().SelectStatementBlocks;
586            }
587        }
588
589        /// <summary>
590        /// パラメータの値を自動的に更新するかどうかを取得または設定します。
591        /// </summary>
592        /// <value>
593        /// パラメータの値を自動的に更新する場合は <see langword="true"/>。
594        /// それ以外の場合は <see langword="false"/>。
595        /// 既定値は <see langword="true"/> です。
596        /// </value>
597        [Themeable(false)]
598        [DefaultValue(true)]
599        [WebCategory("Data")]
600        [WebDescription("Description_CommonDbDataSource_AutoParameterUpdate")]
601        public virtual bool AutoUpdateParameter
602        {
603            get
604            {
605                return GetView().AutoUpdateParameter;
606            }
607
608            set
609            {
610                GetView().AutoUpdateParameter = value;
611            }
612        }
613
614        /// <summary>
615        /// <see cref="CommonDbDataSource"/> コントロールに関連付けられた
616        /// <see cref="CommonDbDataSourceView"/> オブジェクトから、
617        /// <see cref="SelectStatementName"/> プロパティで使用される
618        /// パラメータを格納するパラメータ コレクションを取得します。
619        /// </summary>
620        /// <value>
621        /// <see cref="SelectStatementName"/> プロパティによって使用される
622        /// パラメータを格納している <see cref="ParameterCollection"/>。
623        /// </value>
624        [Themeable(false)]
625        [DefaultValue(null)]
626        [PersistenceMode(PersistenceMode.InnerProperty)]
627        [MergableProperty(false)]
628        [WebCategory("Data")]
629        [WebDescription("Description_CommonDbDataSource_SelectParameters")]
630        public ParameterCollection SelectParameters
631        {
632            get
633            {
634                return GetView().SelectParameters;
635            }
636        }
637
638        /// <summary>
639        /// データを取得するときの最大行数を取得または設定します。
640        /// </summary>
641        /// <value>
642        /// データを取得するときの最大行数。
643        /// 既定値は <c>0</c> です。
644        /// <c>0</c> を指定した場合、全てのデータが取得されるようになります。
645        /// </value>
646        [Themeable(false)]
647        [DefaultValue(0)]
648        [WebCategory("Data")]
649        [WebDescription("Description_CommonDbDataSource_MaximumRows")]
650        public virtual int MaximumRows
651        {
652            get
653            {
654                return GetView().MaximumRows;
655            }
656
657            set
658            {
659                GetView().MaximumRows = value;
660            }
661        }
662
663        /// <summary>
664        /// パラメータの値を自動的に更新するかどうかを取得します。
665        /// </summary>
666        /// <value>
667        /// パラメータの値を自動的に更新する場合は <see langword="true"/>。
668        /// それ以外の場合は <see langword="false"/>。
669        /// 既定値は <see langword="true"/> です。
670        /// </value>
671        internal bool UpdateParameterValue
672        {
673            get
674            {
675                return GetView().UpdateParameterValue;
676            }
677        }
678
679
680        /// <summary>
681        /// 取得したデータ情報を破棄します。
682        /// </summary>
683        /// <remarks>
684        /// このデータソースはページングをサポートしていて、
685        /// データのトータル件数はキャッシュされています。
686        /// このメソッドを呼び出すことにより、この情報を破棄し再取得されるようになります。
687        /// </remarks>
688        public virtual void ClearResult()
689        {
690            GetView().ClearResult();
691        }
692
693        /// <summary>
694        /// <see cref="AutoUpdateParameter"/> が <see langword="false"/> に設定されている場合、
695        /// 次にパラメータの値が必要になった時に最新のパラメータの値を収集します。
696        /// </summary>
697        /// <remarks>
698        /// <see cref="AutoUpdateParameter"/> が <see langword="false"/> に設定されている場合は、
699        /// 保存されているパラメータの値が使用されます。
700        /// このメソッドを呼び出すことにより、最新のパラメータの値が使用されるようになります。
701        /// この呼び出しは1回のポストバックでのみ有効です。
702        /// </remarks>
703        public virtual void UpdateParameter()
704        {
705            GetView().UpdateParameter();
706        }
707
708        /// <summary>
709        /// このデータソースに関連付けられたコネクションを返します。
710        /// </summary>
711        /// <returns>
712        /// コネクション。
713        /// </returns>
714        /// <exception cref="InvalidOperationException">
715        /// コネクションが見つかりません。
716        /// </exception>
717        internal ICommonDbConnection FindConnection()
718        {
719            ICommonDbConnection resultConnection = Connection;
720
721            // コネクションが指定されている場合はそれを返す
722            if (resultConnection != null)
723            {
724                return resultConnection;
725            }
726
727            // ページが設定されているか
728            if (Page == null)
729            {
730                throw new InvalidOperationException(Utility.Format(
731                    Resources.InvalidOperation_CommonDbDataSource_PageNotSet,
732                    ID));
733            }
734
735            // ページが正しいか
736            Page page = Page as Page;
737            if (page == null)
738            {
739                throw new InvalidOperationException(Utility.Format(
740                    Resources.InvalidOperation_CommonDbDataSource_InvalidPage,
741                    ID));
742            }
743
744            string connectionName = ConnectionName;
745            if (string.IsNullOrEmpty(connectionName))
746            {
747                throw new InvalidOperationException(Utility.Format(
748                    Resources.InvalidOperation_CommonDbDataSource_ConnectionNameNotSet,
749                    ID));
750            }
751
752            // 接続先名に対応するコネクションを取得
753            if (!page.Connections.TryGetValue(connectionName, out resultConnection))
754            {
755                throw new InvalidOperationException(Utility.Format(
756                    Resources.InvalidOperation_CommonDbDataSource_ConnectionNotFound,
757                    ID,
758                    connectionName));
759            }
760
761            return resultConnection;
762        }
763
764        /// <summary>
765        /// <see cref="CommonDbDataSource"/> コントロールを格納する
766        /// <see cref="UI.Page"/> コントロールに
767        /// <see cref="System.Web.UI.Page.LoadComplete"/> イベント ハンドラを追加します。
768        /// </summary>
769        /// <param name="e">
770        /// イベント データを格納している <see cref="EventArgs"/>。
771        /// </param>
772        protected override void OnInit(EventArgs e)
773        {
774            base.OnInit(e);
775
776            if (Page != null)
777            {
778                Page.LoadComplete += LoadCompleteEventHandler;
779            }
780        }
781
782        /// <summary>
783        /// コントロールへの変更の追跡および保存の開始点を、
784        /// コントロールのビューステートの一部としてマークします。
785        /// </summary>
786        protected override void TrackViewState()
787        {
788            base.TrackViewState();
789
790            if (view != null)
791            {
792                ((IStateManager)view).TrackViewState();
793            }
794        }
795
796        /// <summary>
797        /// <see cref="CommonDbDataSource"/> コントロールの保存された状態を読み込みます。
798        /// </summary>
799        /// <param name="savedState">
800        /// <see cref="CommonDbDataSource"/> の保存された状態を格納している
801        /// <see cref="Object"/>。
802        /// </param>
803        protected override void LoadViewState(object savedState)
804        {
805            if (savedState == null)
806            {
807                base.LoadViewState(null);
808                return;
809            }
810
811            Pair state = (Pair)savedState;
812
813            base.LoadViewState(state.First);
814
815            if (state.Second != null)
816            {
817                ((IStateManager)GetView()).LoadViewState(state.Second);
818            }
819        }
820
821        /// <summary>
822        /// <see cref="CommonDbDataSource"/> コントロールの状態を格納します。
823        /// </summary>
824        /// <returns>
825        /// <see cref="CommonDbDataSource"/> の保存された状態を格納しているオブジェクト。
826        /// </returns>
827        protected override object SaveViewState()
828        {
829            Pair state = new Pair
830            {
831                First = base.SaveViewState(),
832            };
833
834            if (view != null)
835            {
836                state.Second = ((IStateManager)view).SaveViewState();
837            }
838
839            if (state.First == null && state.Second == null)
840            {
841                return null;
842            }
843
844            return state;
845        }
846
847        /// <summary>
848        /// データ ソースをサーバー コントロールの子コントロールにバインドします。
849        /// </summary>
850        protected override void DataBindChildren()
851        {
852            // 親を呼び出す
853            base.DataBindChildren();
854
855            // バインドが必要なパラメータにデータをバインド
856            BoundParameter.DataBind(Page, SelectParameters);
857        }
858
859        /// <summary>
860        /// <see cref="CommonDbDataSource"/> インターフェイスに関連付けられた
861        /// ビュー オブジェクトのリストを表す名前のコレクションを取得します。
862        /// </summary>
863        /// <returns>
864        /// <see cref="CommonDbDataSource"/> に関連付けられたビューの名前が格納されている
865        /// <see cref="ICollection"/>。
866        /// </returns>
867        protected override ICollection GetViewNames()
868        {
869            return viewNames ?? (viewNames = new[] { DefaultViewName });
870        }
871
872        /// <summary>
873        /// データ ソース コントロールに関連付けられた名前付きデータ ソース ビューを取得します。
874        /// </summary>
875        /// <param name="viewName">
876        /// 取得するビューの名前。
877        /// </param>
878        /// <returns>
879        /// <see cref="CommonDbDataSource"/> に関連付けられた名前付きの
880        /// <see cref="CommonDbDataSourceView"/> を返します。
881        /// </returns>
882        /// <exception cref="ArgumentException">
883        /// <paramref name="viewName"/> が正しくありません。
884        /// </exception>
885        protected override DataSourceView GetView(string viewName)
886        {
887            if (viewName == null
888                || (viewName.Length != 0
889                    && !string.Equals(viewName, DefaultViewName, StringComparison.OrdinalIgnoreCase)))
890            {
891                throw new ArgumentException(
892                    Resources.Argument_CommonDbDataSource_ViewName, "viewName");
893            }
894
895            return GetView();
896        }
897
898        /// <summary>
899        /// データ ソース コントロールに関連付けられたデータ ソース ビュー オブジェクトを作成します。
900        /// </summary>
901        /// <param name="viewName">
902        /// データ ソース ビューの名前。
903        /// </param>
904        /// <returns>
905        /// <see cref="CommonDbDataSource"/> に関連付けられた
906        /// <see cref="CommonDbDataSourceView"/>。
907        /// </returns>
908        protected virtual CommonDbDataSourceView CreateDataSourceView(string viewName)
909        {
910            return new CommonDbDataSourceView(this, viewName, Context);
911        }
912
913        /// <summary>
914        /// ビューを取得します。
915        /// </summary>
916        /// <returns>
917        /// 関連付けられたビュー。
918        /// </returns>
919        private CommonDbDataSourceView GetView()
920        {
921            return view ?? (view = CreateDataSourceView(DefaultViewName));
922        }
923
924        /// <summary>
925        /// ページのロードが完了したときに呼び出される
926        /// <see cref="System.Web.UI.Page.LoadComplete"/> イベント ハンドラです。
927        /// </summary>
928        /// <param name="sender">
929        /// イベントのソース。
930        /// </param>
931        /// <param name="e">
932        /// イベント データを格納している <see cref="EventArgs"/>。
933        /// </param>
934        private void LoadCompleteEventHandler(object sender, EventArgs e)
935        {
936            SelectParameters.UpdateValues(Context, this);
937        }
938    }
939}
詳しい使い方は TracBrowser を参照してください。