Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fixed a dispose issue for commands with active readers |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | sourceforge |
Files: | files | file ages | folders |
SHA1: |
505e5291d5bc031830d0b5b4ff6af921 |
User & Date: | rmsimpson 2006-02-10 15:08:48.000 |
Context
2006-02-10
| ||
19:44 | Lots of schema fixes and support for new 3.3.4 stuff check-in: 9e6e1cf6df user: rmsimpson tags: sourceforge | |
15:08 | Fixed a dispose issue for commands with active readers check-in: 505e5291d5 user: rmsimpson tags: sourceforge | |
15:04 | Removed some test stuff check-in: 89e5e0867e user: rmsimpson tags: sourceforge | |
Changes
Changes to System.Data.SQLite/SQLiteCommand.cs.
︙ | ︙ | |||
24 25 26 27 28 29 30 | /// <summary> /// The connection the command is associated with /// </summary> private SQLiteConnection _cnn; /// <summary> /// Indicates whether or not a DataReader is active on the command. /// </summary> | | | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /// <summary> /// The connection the command is associated with /// </summary> private SQLiteConnection _cnn; /// <summary> /// Indicates whether or not a DataReader is active on the command. /// </summary> private SQLiteDataReader _activeReader; /// <summary> /// The timeout for the command, kludged because SQLite doesn't support per-command timeout values /// </summary> internal int _commandTimeout; /// <summary> /// Designer support /// </summary> |
︙ | ︙ | |||
114 115 116 117 118 119 120 | /// Initializes the command class /// </summary> /// <param name="strSql">The SQL command text</param> /// <param name="cnn">A connection to associate with the command</param> private void Initialize(string strSql, SQLiteConnection cnn) { _statementList = null; | | > > > > > > > > | 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | /// Initializes the command class /// </summary> /// <param name="strSql">The SQL command text</param> /// <param name="cnn">A connection to associate with the command</param> private void Initialize(string strSql, SQLiteConnection cnn) { _statementList = null; _activeReader = null; _commandTimeout = 30; _parameterCollection = new SQLiteParameterCollection(this); _designTimeVisible = true; _updateRowSource = UpdateRowSource.FirstReturnedRecord; _transaction = null; if (strSql != null) CommandText = strSql; if (cnn != null) DbConnection = cnn; } /// <summary> /// Disposes of the command and clears all member variables /// </summary> /// <param name="disposing">Whether or not the class is being explicitly or implicitly disposed</param> protected override void Dispose(bool disposing) { base.Dispose(disposing); // If a reader is active on this command, don't destroy it completely if (_activeReader != null) { _activeReader._disposeCommand = true; return; } Connection = null; _parameterCollection.Clear(); _commandText = null; } /// <summary> /// Clears and destroys all statements currently prepared |
︙ | ︙ | |||
226 227 228 229 230 231 232 | { return _commandText; } set { if (_commandText == value) return; | | | 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 | { return _commandText; } set { if (_commandText == value) return; if (_activeReader != null) { throw new InvalidOperationException("Cannot set CommandText while a DataReader is active"); } ClearCommands(); _commandText = value; |
︙ | ︙ | |||
297 298 299 300 301 302 303 | /// The connection associated with this command /// </summary> public new SQLiteConnection Connection { get { return _cnn; } set { | | | 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 | /// The connection associated with this command /// </summary> public new SQLiteConnection Connection { get { return _cnn; } set { if (_activeReader != null) throw new InvalidOperationException("Cannot set Connection while a DataReader is active"); if (_cnn != null) { ClearCommands(); _cnn._commandList.Remove(this); } |
︙ | ︙ | |||
358 359 360 361 362 363 364 | public new SQLiteTransaction Transaction { get { return _transaction; } set { if (_cnn != null) { | | | 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 | public new SQLiteTransaction Transaction { get { return _transaction; } set { if (_cnn != null) { if (_activeReader != null) throw new InvalidOperationException("Cannot set Transaction while a DataReader is active"); if (value != null) { if (value._cnn != _cnn) throw new ArgumentException("Transaction is not associated with the command's connection"); } |
︙ | ︙ | |||
395 396 397 398 399 400 401 | /// <summary> /// This function ensures there are no active readers, that we have a valid connection, /// that the connection is open, that all statements are prepared and all parameters are assigned /// in preparation for allocating a data reader. /// </summary> private void InitializeForReader() { | | | 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 | /// <summary> /// This function ensures there are no active readers, that we have a valid connection, /// that the connection is open, that all statements are prepared and all parameters are assigned /// in preparation for allocating a data reader. /// </summary> private void InitializeForReader() { if (_activeReader != null) throw new InvalidOperationException("DataReader already active on this command"); if (_cnn == null) throw new InvalidOperationException("No connection associated with this command"); if (_cnn.State != ConnectionState.Open) throw new InvalidOperationException("Database is not open"); |
︙ | ︙ | |||
431 432 433 434 435 436 437 | /// <param name="behavior">The flags to be associated with the reader</param> /// <returns>A SQLiteDataReader</returns> public new SQLiteDataReader ExecuteReader(CommandBehavior behavior) { InitializeForReader(); SQLiteDataReader rd = new SQLiteDataReader(this, behavior); | | | | 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 | /// <param name="behavior">The flags to be associated with the reader</param> /// <returns>A SQLiteDataReader</returns> public new SQLiteDataReader ExecuteReader(CommandBehavior behavior) { InitializeForReader(); SQLiteDataReader rd = new SQLiteDataReader(this, behavior); _activeReader = rd; return rd; } /// <summary> /// Overrides the default behavior of DbDataReader to return a specialized SQLiteDataReader class /// </summary> /// <returns>A SQLiteDataReader</returns> public new SQLiteDataReader ExecuteReader() { return ExecuteReader(CommandBehavior.Default); } /// <summary> /// Called by the SQLiteDataReader when the data reader is closed. /// </summary> internal void ClearDataReader() { _activeReader = null; } /// <summary> /// Execute the command and return the number of rows inserted/updated affected by it. /// </summary> /// <returns></returns> public override int ExecuteNonQuery() |
︙ | ︙ |
Changes to System.Data.SQLite/SQLiteDataReader.cs.
︙ | ︙ | |||
53 54 55 56 57 58 59 60 61 62 63 64 65 66 | private SQLiteType[] _fieldTypeArray; /// <summary> /// The behavior of the datareader /// </summary> private CommandBehavior _commandBehavior; /// <summary> /// Internal constructor, initializes the datareader and sets up to begin executing statements /// </summary> /// <param name="cmd">The SQLiteCommand this data reader is for</param> /// <param name="behave">The expected behavior of the data reader</param> internal SQLiteDataReader(SQLiteCommand cmd, CommandBehavior behave) { | > > > > > | 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | private SQLiteType[] _fieldTypeArray; /// <summary> /// The behavior of the datareader /// </summary> private CommandBehavior _commandBehavior; /// <summary> /// If set, then dispose of the command object when the reader is finished /// </summary> internal bool _disposeCommand; /// <summary> /// Internal constructor, initializes the datareader and sets up to begin executing statements /// </summary> /// <param name="cmd">The SQLiteCommand this data reader is for</param> /// <param name="behave">The expected behavior of the data reader</param> internal SQLiteDataReader(SQLiteCommand cmd, CommandBehavior behave) { |
︙ | ︙ | |||
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | { if (_command != null) { while (NextResult()) { } _command.ClearDataReader(); } // If the datareader's behavior includes closing the connection, then do so here. if ((_commandBehavior & CommandBehavior.CloseConnection) != 0) _command.Connection.Close(); _command = null; _activeStatement = null; _fieldTypeArray = null; } /// <summary> /// Disposes the datareader. Calls Close() to ensure everything is cleaned up. /// </summary> protected override void Dispose(bool disposing) { | > > > < > | 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | { if (_command != null) { while (NextResult()) { } _command.ClearDataReader(); if (_disposeCommand) ((IDisposable)_command).Dispose(); } // If the datareader's behavior includes closing the connection, then do so here. if ((_commandBehavior & CommandBehavior.CloseConnection) != 0) _command.Connection.Close(); _command = null; _activeStatement = null; _fieldTypeArray = null; } /// <summary> /// Disposes the datareader. Calls Close() to ensure everything is cleaned up. /// </summary> protected override void Dispose(bool disposing) { base.Dispose(disposing); GC.SuppressFinalize(this); } /// <summary> /// Throw an error if the datareader is closed /// </summary> private void CheckClosed() { |
︙ | ︙ |