internal SQLiteStatement GetStatement(int index) { // Haven't built any statements yet if (_statementList == null) { return(BuildNextCommand()); } // If we're at the last built statement and want the next unbuilt statement, then build it if (index == _statementList.Count) { if (String.IsNullOrEmpty(_remainingText) == false) { return(BuildNextCommand()); } else { return(null); // No more commands } } SQLiteStatement stmt = _statementList[index]; stmt.BindParameters(); return(stmt); }
/// <summary> /// Builds an array of prepared statements for each complete SQL statement in the command text /// </summary> internal SQLiteStatement BuildNextCommand() { SQLiteStatement stmt = null; try { if ((_cnn != null) && (_cnn._sql != null)) { if (_statementList == null) { _remainingText = _commandText; } stmt = _cnn._sql.Prepare(_cnn, _remainingText, (_statementList == null) ? null : _statementList[_statementList.Count - 1], (uint)(_commandTimeout * 1000), out _remainingText); if (stmt != null) { stmt._command = this; if (_statementList == null) { _statementList = new List <SQLiteStatement>(); } _statementList.Add(stmt); _parameterCollection.MapParameters(stmt); stmt.BindParameters(); } } return(stmt); } catch (Exception) { if (stmt != null) { if ((_statementList != null) && _statementList.Contains(stmt)) { _statementList.Remove(stmt); } stmt.Dispose(); } // If we threw an error compiling the statement, we cannot continue on so set the remaining text to null. _remainingText = null; throw; } }
internal override SQLiteErrorCode Reset(SQLiteStatement stmt) { SQLiteErrorCode n; #if !SQLITE_STANDARD n = UnsafeNativeMethods.sqlite3_reset_interop(stmt._sqlite_stmt); #else n = UnsafeNativeMethods.sqlite3_reset(stmt._sqlite_stmt); #endif // If the schema changed, try and re-prepare it if (n == SQLiteErrorCode.Schema) { // Recreate a dummy statement string str; using (SQLiteStatement tmp = Prepare(null, stmt._sqlStatement, null, (uint)(stmt._command._commandTimeout * 1000), out str)) { // Finalize the existing statement stmt._sqlite_stmt.Dispose(); // Reassign a new statement pointer to the old statement and clear the temporary one stmt._sqlite_stmt = tmp._sqlite_stmt; tmp._sqlite_stmt = null; // Reapply parameters stmt.BindParameters(); } return SQLiteErrorCode.Unknown; // Reset was OK, with schema change } else if (n == SQLiteErrorCode.Locked || n == SQLiteErrorCode.Busy) return n; if (n != SQLiteErrorCode.Ok) throw new SQLiteException(n, GetLastError()); return n; // We reset OK, no schema changes }