チェンジセット 1654 (default)


以下の違いを無視:
日時:
2024/08/07 4:24:55 (2ヵ月前)
更新者:
hizuya@…
ログメッセージ:
  • データリーダを破棄するときに、自動的にコマンドのキャンセルを呼び出す機能を追加。
場所:
framework/trunk/CoreLibrary
ファイル:
12個の更新

凡例:

未変更
追加
削除
  • framework/trunk/CoreLibrary/Properties/Resources.designer.cs

    r1628 r1654  
    20122012         
    20132013        /// <summary> 
     2014        ///   Depth is not zero. に類似しているローカライズされた文字列を検索します。 
     2015        /// </summary> 
     2016        internal static string InvalidOperation_DataReaderWrapper_DepthIsNotZero { 
     2017            get { 
     2018                return ResourceManager.GetString("InvalidOperation_DataReaderWrapper_DepthIsNotZero", resourceCulture); 
     2019            } 
     2020        } 
     2021         
     2022        /// <summary> 
    20142023        ///   DbRValue object is DbDefault. に類似しているローカライズされた文字列を検索します。 
    20152024        /// </summary> 
  • framework/trunk/CoreLibrary/Properties/Resources.resx

    r1628 r1654  
    13741374    <value>The stream has reached the end. The missing length is {0}.</value> 
    13751375  </data> 
     1376  <data name="InvalidOperation_DataReaderWrapper_DepthIsNotZero" xml:space="preserve"> 
     1377    <value>Depth is not zero.</value> 
     1378  </data> 
    13761379</root> 
  • framework/trunk/CoreLibrary/Sources/Data/Common/CommonDbDataReader.cs

    r864 r1654  
    3030    /// </summary> 
    3131    /// <typeparam name="T"> 
    32     /// ADO.NET のパラメータの型。 
     32    /// ADO.NET のデータリーダの型。 
    3333    /// </typeparam> 
    34     public abstract class CommonDbDataReader<T> : 
    35         DataReaderWrapper<T> 
     34    /// <typeparam name="TCommand"> 
     35    /// コマンドの型。 
     36    /// </typeparam> 
     37    public abstract class CommonDbDataReader<T, TCommand> : 
     38        DataReaderWrapper<T, TCommand> 
    3639        where T : class, IDataReader 
     40        where TCommand : class, ICommonDbCommand 
    3741    { 
    3842        /// <summary> 
    3943        /// 新しいインスタンスを作成します。 
    4044        /// </summary> 
     45        /// <param name="command"> 
     46        /// データリーダを作成する元になったコマンド。 
     47        /// </param> 
    4148        /// <param name="dataReader"> 
    4249        /// ADO.NET のデータリーダ。 
    4350        /// </param> 
    44         protected CommonDbDataReader(T dataReader) 
    45             : base(dataReader) 
     51        protected CommonDbDataReader(TCommand command, T dataReader) 
     52            : base(command, dataReader) 
    4653        { 
    4754            // AVOID 
  • framework/trunk/CoreLibrary/Sources/Data/DataReaderWrapper.cs

    r1085 r1654  
    3737    /// ADO.NET のデータリーダの型。 
    3838    /// </typeparam> 
    39     public class DataReaderWrapper<T> : 
     39    /// <typeparam name="TCommand"> 
     40    /// コマンドの型。 
     41    /// </typeparam> 
     42    public class DataReaderWrapper<T, TCommand> : 
    4043        MarshalByRefObject, 
    4144        ICommonDbDataReader 
    4245        where T : class, IDataReader 
     46        where TCommand : class, ICommonDbCommand 
    4347    { 
     48        /// <summary> 
     49        /// データリーダを作成する元になったコマンド。 
     50        /// </summary> 
     51        private readonly TCommand command; 
     52 
    4453        /// <summary> 
    4554        /// ADO.NET のデータリーダ。 
     
    4857        private readonly T dataReader; 
    4958 
     59        /// <summary> 
     60        /// 入れ子の深さ。 
     61        /// </summary> 
     62        /// <remarks> 
     63        /// <see cref="IDataReader"/> がクローズされていると 
     64        /// <see cref="IDataReader.Depth"/> にアクセスできないために用意されています。 
     65        /// </remarks> 
     66        private readonly int depth; 
     67 
     68        /// <summary> 
     69        /// データリーダを破棄するときに元になったコマンドを破棄するかどうか。 
     70        /// </summary> 
     71        [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     72        private bool autoCancel = true; 
     73 
    5074 
    5175        /// <summary> 
    5276        /// 指定されたデータリーダをラップするインスタンスを作成します。 
    5377        /// </summary> 
     78        /// <param name="command"> 
     79        /// データリーダを作成する元になったコマンド。 
     80        /// </param> 
    5481        /// <param name="dataReader"> 
    5582        /// 元にするデータリーダ。 
    5683        /// </param> 
    57         public DataReaderWrapper(T dataReader) 
    58         { 
     84        public DataReaderWrapper(TCommand command, T dataReader) 
     85            : this(command, dataReader, 0) 
     86        { 
     87            // AVOID 
     88        } 
     89 
     90        /// <summary> 
     91        /// 指定されたデータリーダをラップするインスタンスを作成します。 
     92        /// </summary> 
     93        /// <param name="command"> 
     94        /// データリーダを作成する元になったコマンド。 
     95        /// </param> 
     96        /// <param name="dataReader"> 
     97        /// 元にするデータリーダ。 
     98        /// </param> 
     99        /// <param name="depth"> 
     100        /// 入れ子の深さ。 
     101        /// 最も外側のテーブルの深さは <c>0</c> です。 
     102        /// </param> 
     103        private DataReaderWrapper(TCommand command, T dataReader, int depth) 
     104        { 
     105            this.command = command; 
    59106            this.dataReader = dataReader; 
     107            this.depth = depth; 
    60108        } 
    61109 
     
    72120            { 
    73121                return dataReader; 
     122            } 
     123        } 
     124 
     125        /// <summary> 
     126        /// データリーダを破棄するときに元になったコマンドを破棄するかどうかを取得または設定します。 
     127        /// </summary> 
     128        /// <value> 
     129        /// データリーダを破棄するときに元になったコマンドを破棄する場合は <see langword="true"/>。 
     130        /// それ以外の場合は <see langword="false"/>。 
     131        /// 既定値は、入れ子の深さが <c>0</c> の場合は <see langword="true"/>。 
     132        /// それ以外の場合は <see langword="false"/>。 
     133        /// 入れ子の深さが <c>0</c> 以外の場合は <see langword="true"/> に設定することが出来ません。 
     134        /// </value> 
     135        /// <exception cref="InvalidOperationException" accessor="set"> 
     136        /// 入れ子の深さが <c>0</c> 以外にも関わらず、<see langword="true"/> を設定しました。 
     137        /// </exception> 
     138        /// <remarks> 
     139        /// このプロパティが <see langword="true"/> の場合、データリーダを破棄する時に 
     140        /// <see cref="IDbCommand.Cancel"/> が呼び出されます。 
     141        /// データリーダを破棄するときにカーソルによるデータを読み込み途中の場合、読み込みはそこで中断されます。 
     142        /// <see langword="false"/> の場合は末尾まで読み込まれる場合があります。 
     143        /// </remarks> 
     144        public bool AutoCancel 
     145        { 
     146            get 
     147            { 
     148                return autoCancel && depth == 0; 
     149            } 
     150 
     151            set 
     152            { 
     153                if (value && depth != 0) 
     154                { 
     155                    throw new InvalidOperationException(Resources.InvalidOperation_DataReaderWrapper_DepthIsNotZero); 
     156                } 
     157 
     158                autoCancel = value; 
    74159            } 
    75160        } 
     
    265350            return dataReader.GetOrdinal(name); 
    266351        } 
    267          
     352 
    268353        /// <summary> 
    269354        /// 指定したフィールドが <see langword="null"/> に設定されているかどうかを示す値を返します。 
     
    9431028        /// <summary> 
    9441029        /// フィールドがさらにリモートの構造化データを指しているときに使用する 
    945         /// <see cref="DataReaderWrapper{T}"/> を取得します。 
     1030        /// <see cref="DataReaderWrapper{T, TCommand}"/> を取得します。 
    9461031        /// </summary> 
    9471032        /// <param name="index"> 
     
    9501035        /// <returns> 
    9511036        /// フィールドがさらにリモートの構造化データを指しているときに使用する 
    952         /// <see cref="DataReaderWrapper{T}"/>。 
     1037        /// <see cref="DataReaderWrapper{T, TCommand}"/>。 
    9531038        /// </returns> 
    9541039        /// <exception cref="DataException"> 
    9551040        /// 取得したリモートの構造化データがサポートされていない形式です。 
    9561041        /// </exception> 
    957         public virtual DataReaderWrapper<T> GetData(int index) 
     1042        public virtual DataReaderWrapper<T, TCommand> GetData(int index) 
    9581043        { 
    9591044            IDataReader innerReader = dataReader.GetData(index); 
     
    9631048            } 
    9641049 
    965             DataReaderWrapper<T> innerReaderWrapper = innerReader as DataReaderWrapper<T>; 
     1050            DataReaderWrapper<T, TCommand> innerReaderWrapper = innerReader as DataReaderWrapper<T, TCommand>; 
    9661051            if (innerReaderWrapper != null) 
    9671052            { 
     
    9751060            } 
    9761061 
    977             return new DataReaderWrapper<T>(nativeInnerReader); 
     1062            return new DataReaderWrapper<T, TCommand>(command, nativeInnerReader, depth + 1); 
    9781063        } 
    9791064 
    9801065        /// <summary> 
    9811066        /// フィールドがさらにリモートの構造化データを指しているときに使用する 
    982         /// <see cref="DataReaderWrapper{T}"/> を取得します。 
     1067        /// <see cref="DataReaderWrapper{T, TCommand}"/> を取得します。 
    9831068        /// </summary> 
    9841069        /// <param name="index"> 
     
    9901075        /// <returns> 
    9911076        /// フィールドがさらにリモートの構造化データを指しているときに使用する 
    992         /// <see cref="DataReaderWrapper{T}"/>。 
    993         /// </returns> 
    994         public virtual DataReaderWrapper<T> GetData(int index, DataReaderWrapper<T> defaultValue) 
     1077        /// <see cref="DataReaderWrapper{T, TCommand}"/>。 
     1078        /// </returns> 
     1079        public virtual DataReaderWrapper<T, TCommand> GetData(int index, DataReaderWrapper<T, TCommand> defaultValue) 
    9951080        { 
    9961081            if (IsDBNull(index)) 
     
    10041089        /// <summary> 
    10051090        /// フィールドがさらにリモートの構造化データを指しているときに使用する 
    1006         /// <see cref="DataReaderWrapper{T}"/> を取得します。 
     1091        /// <see cref="DataReaderWrapper{T, TCommand}"/> を取得します。 
    10071092        /// </summary> 
    10081093        /// <param name="name"> 
     
    10111096        /// <returns> 
    10121097        /// フィールドがさらにリモートの構造化データを指しているときに使用する 
    1013         /// <see cref="DataReaderWrapper{T}"/>。 
    1014         /// </returns> 
    1015         public virtual DataReaderWrapper<T> GetData(string name) 
     1098        /// <see cref="DataReaderWrapper{T, TCommand}"/>。 
     1099        /// </returns> 
     1100        public virtual DataReaderWrapper<T, TCommand> GetData(string name) 
    10161101        { 
    10171102            return GetData(GetOrdinal(name)); 
     
    10201105        /// <summary> 
    10211106        /// フィールドがさらにリモートの構造化データを指しているときに使用する 
    1022         /// <see cref="DataReaderWrapper{T}"/> を取得します。 
     1107        /// <see cref="DataReaderWrapper{T, TCommand}"/> を取得します。 
    10231108        /// </summary> 
    10241109        /// <param name="name"> 
     
    10301115        /// <returns> 
    10311116        /// フィールドがさらにリモートの構造化データを指しているときに使用する 
    1032         /// <see cref="DataReaderWrapper{T}"/>。 
    1033         /// </returns> 
    1034         public virtual DataReaderWrapper<T> GetData(string name, DataReaderWrapper<T> defaultValue) 
     1117        /// <see cref="DataReaderWrapper{T, TCommand}"/>。 
     1118        /// </returns> 
     1119        public virtual DataReaderWrapper<T, TCommand> GetData(string name, DataReaderWrapper<T, TCommand> defaultValue) 
    10351120        { 
    10361121            int index = GetOrdinal(name); 
     
    22712356        IDataReader ICommonDbDataReader.GetData(int index, IDataReader defaultValue) 
    22722357        { 
    2273             return GetData(index, Utility.EnsureArgumentType<DataReaderWrapper<T>>(defaultValue, "default")); 
     2358            return GetData(index, Utility.EnsureArgumentType<DataReaderWrapper<T, TCommand>>(defaultValue, "default")); 
    22742359        } 
    22752360 
     
    23042389        IDataReader ICommonDbDataReader.GetData(string name, IDataReader defaultValue) 
    23052390        { 
    2306             return GetData(name, Utility.EnsureArgumentType<DataReaderWrapper<T>>(defaultValue, "default")); 
     2391            return GetData(name, Utility.EnsureArgumentType<DataReaderWrapper<T, TCommand>>(defaultValue, "default")); 
    23072392        } 
    23082393 
     
    23372422            } 
    23382423 
    2339             dataReader.Close(); 
     2424            try 
     2425            { 
     2426                // コマンドをキャンセルする 
     2427                if (AutoCancel) 
     2428                { 
     2429                    command.Cancel(); 
     2430                } 
     2431            } 
     2432            finally 
     2433            { 
     2434                dataReader.Close(); 
     2435            } 
    23402436        } 
    23412437    } 
  • framework/trunk/CoreLibrary/Sources/Data/OleDb/OleDbDataReader.cs

    r864 r1654  
    3131    /// </summary> 
    3232    public sealed class OleDbDataReader : 
    33         CommonDbDataReader<System.Data.OleDb.OleDbDataReader> 
     33        CommonDbDataReader<System.Data.OleDb.OleDbDataReader, OleDbCommand> 
    3434    { 
    3535        /// <summary> 
    3636        /// 新しいインスタンスを作成します。 
    3737        /// </summary> 
     38        /// <param name="command"> 
     39        /// データリーダを作成する元になったコマンド。 
     40        /// </param> 
    3841        /// <param name="dataReader"> 
    3942        /// ADO.NET のデータリーダ。 
    4043        /// </param> 
    41         internal OleDbDataReader(System.Data.OleDb.OleDbDataReader dataReader) 
    42             : base(dataReader) 
     44        internal OleDbDataReader(OleDbCommand command, System.Data.OleDb.OleDbDataReader dataReader) 
     45            : base(command, dataReader) 
    4346        { 
    4447            // AVOID 
  • framework/trunk/CoreLibrary/Sources/Data/OleDb/OleDbProvider.cs

    r1080 r1654  
    114114            return new OleDbDataAdapter(); 
    115115        } 
    116          
     116 
    117117        /// <summary> 
    118118        /// コマンドを作成して返します。 
     
    168168            CommandBehavior behavior) 
    169169        { 
    170             return new OleDbDataReader(command.NativeDbCommand.ExecuteReader(behavior)); 
     170            return new OleDbDataReader(command, command.NativeDbCommand.ExecuteReader(behavior)); 
    171171        } 
    172172    } 
  • framework/trunk/CoreLibrary/Sources/Data/Oracle/OracleDataReader.cs

    r864 r1654  
    3131    /// </summary> 
    3232    public sealed class OracleDataReader : 
    33         CommonDbDataReader<System.Data.OracleClient.OracleDataReader> 
     33        CommonDbDataReader<System.Data.OracleClient.OracleDataReader, OracleCommand> 
    3434    { 
    3535        /// <summary> 
    3636        /// 新しいインスタンスを作成します。 
    3737        /// </summary> 
     38        /// <param name="command"> 
     39        /// データリーダを作成する元になったコマンド。 
     40        /// </param> 
    3841        /// <param name="dataReader"> 
    3942        /// ADO.NET のデータリーダ。 
    4043        /// </param> 
    41         internal OracleDataReader(System.Data.OracleClient.OracleDataReader dataReader) 
    42             : base(dataReader) 
     44        internal OracleDataReader(OracleCommand command, System.Data.OracleClient.OracleDataReader dataReader) 
     45            : base(command, dataReader) 
    4346        { 
    4447            // AVOID 
  • framework/trunk/CoreLibrary/Sources/Data/Oracle/OracleProvider.cs

    r1080 r1654  
    3838        /// </summary> 
    3939        private static readonly OracleUtility UtilityInstance = new OracleUtility(); 
    40          
     40 
    4141 
    4242        /// <summary> 
     
    114114            return new OracleDataAdapter(); 
    115115        } 
    116          
     116 
    117117        /// <summary> 
    118118        /// コマンドを作成して返します。 
     
    168168            CommandBehavior behavior) 
    169169        { 
    170             return new OracleDataReader(command.NativeDbCommand.ExecuteReader(behavior)); 
     170            return new OracleDataReader(command, command.NativeDbCommand.ExecuteReader(behavior)); 
    171171        } 
    172172    } 
  • framework/trunk/CoreLibrary/Sources/Data/SQLite/SQLiteDataReader.cs

    r911 r1654  
    3131    /// </summary> 
    3232    public sealed class SQLiteDataReader : 
    33         CommonDbDataReader<System.Data.SQLite.SQLiteDataReader> 
     33        CommonDbDataReader<System.Data.SQLite.SQLiteDataReader, SQLiteCommand> 
    3434    { 
    3535        /// <summary> 
    3636        /// 新しいインスタンスを作成します。 
    3737        /// </summary> 
     38        /// <param name="command"> 
     39        /// データリーダを作成する元になったコマンド。 
     40        /// </param> 
    3841        /// <param name="dataReader"> 
    3942        /// ADO.NET のデータリーダ。 
    4043        /// </param> 
    41         internal SQLiteDataReader(System.Data.SQLite.SQLiteDataReader dataReader) 
    42             : base(dataReader) 
     44        internal SQLiteDataReader(SQLiteCommand command, System.Data.SQLite.SQLiteDataReader dataReader) 
     45            : base(command, dataReader) 
    4346        { 
    4447            // AVOID 
  • framework/trunk/CoreLibrary/Sources/Data/SQLite/SQLiteProvider.cs

    r1080 r1654  
    3838        /// </summary> 
    3939        private static readonly SQLiteUtility UtilityInstance = new SQLiteUtility(); 
    40          
     40 
    4141 
    4242        /// <summary> 
     
    114114            return new SQLiteDataAdapter(); 
    115115        } 
    116          
     116 
    117117        /// <summary> 
    118118        /// コマンドを作成して返します。 
     
    168168            CommandBehavior behavior) 
    169169        { 
    170             return new SQLiteDataReader(command.NativeDbCommand.ExecuteReader(behavior)); 
     170            return new SQLiteDataReader(command, command.NativeDbCommand.ExecuteReader(behavior)); 
    171171        } 
    172172    } 
  • framework/trunk/CoreLibrary/Sources/Data/Sql/SqlDataReader.cs

    r864 r1654  
    3131    /// </summary> 
    3232    public sealed class SqlDataReader : 
    33         CommonDbDataReader<System.Data.SqlClient.SqlDataReader> 
     33        CommonDbDataReader<System.Data.SqlClient.SqlDataReader, SqlCommand> 
    3434    { 
    3535        /// <summary> 
    3636        /// 新しいインスタンスを作成します。 
    3737        /// </summary> 
     38        /// <param name="command"> 
     39        /// データリーダを作成する元になったコマンド。 
     40        /// </param> 
    3841        /// <param name="dataReader"> 
    3942        /// ADO.NET のデータリーダ。 
    4043        /// </param> 
    41         internal SqlDataReader(System.Data.SqlClient.SqlDataReader dataReader) 
    42             : base(dataReader) 
     44        internal SqlDataReader(SqlCommand command, System.Data.SqlClient.SqlDataReader dataReader) 
     45            : base(command, dataReader) 
    4346        { 
    4447            // AVOID 
  • framework/trunk/CoreLibrary/Sources/Data/Sql/SqlProvider.cs

    r1119 r1654  
    4040        /// </summary> 
    4141        private static readonly SqlUtility UtilityInstance = new SqlUtility(); 
    42          
     42 
    4343 
    4444        /// <summary> 
     
    133133            return new SqlDataAdapter(); 
    134134        } 
    135          
     135 
    136136        /// <summary> 
    137137        /// コマンドを作成して返します。 
     
    190190            CommandBehavior behavior) 
    191191        { 
    192             return new SqlDataReader(command.NativeDbCommand.ExecuteReader(behavior)); 
     192            return new SqlDataReader(command, command.NativeDbCommand.ExecuteReader(behavior)); 
    193193        } 
    194194 
     
    245245        /// </param> 
    246246        /// <param name="options"> 
    247         /// この依存関係で使用する通知要求オプション。既定のサービスを使用する場合は <see langword="null"/>。  
     247        /// この依存関係で使用する通知要求オプション。既定のサービスを使用する場合は <see langword="null"/>。 
    248248        /// </param> 
    249249        /// <param name="timeout"> 
    250250        /// この通知のタイムアウト (秒)。既定値は <c>0</c> 
    251         /// で、サーバーのタイムアウトが使用されることを示します。  
     251        /// で、サーバーのタイムアウトが使用されることを示します。 
    252252        /// </param> 
    253253        /// <returns> 
詳しい使い方は TracChangeset を参照してください。