public SQLiteTransaction BeginTransaction() { if (mState != ConnectionState.Open) { throw new InvalidOperationException(); } if (mpTrans != null) { throw new NotSupportedException(); } return mpTrans = new SQLiteTransaction(this); }
/// <summary>Starts a batch load/update of the store. Batching allows caching and can improve /// performance.</summary> public void BeginBatch() { if (_tx != null) { throw new InvalidOperationException("Cannot call BeginBatch while a previous batch is still pending"); } _tx = Connection.BeginTransaction(); }
public void EndBatch() { if (_tx == null) { throw new InvalidOperationException("There is no outstanding batch on this thread"); } _tx.Commit(); _tx.Dispose(); _tx = null; }
/// <summary> /// Create and prepare a SQLiteCommand, and call ExecuteReader with the appropriate CommandBehavior. /// </summary> /// <remarks> /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. /// /// If the caller provided the connection, we want to leave it to them to manage. /// </remarks> /// <param name="connection">A valid SQLiteConnection, on which to execute this command</param> /// <param name="transaction">A valid SQLiteTransaction, or 'null'</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command</param> /// <param name="commandParameters">An array of SQLiteParameters to be associated with the command or 'null' if no parameters are required</param> /// <param name="connectionOwnership">Indicates whether the connection parameter was provided by the caller, or created by SQLiteHelper</param> /// <returns>SQLiteDataReader containing the results of the command</returns> private static SQLiteDataReader ExecuteReader(SQLiteConnection connection, SQLiteTransaction transaction, CommandType commandType, string commandText, SQLiteParameter[] commandParameters, SQLiteConnectionOwnership connectionOwnership) { if( connection == null ) throw new ArgumentNullException( "connection" ); bool mustCloseConnection = false; // Create a command and prepare it for execution SQLiteCommand cmd = new SQLiteCommand(); try { PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection ); // Create a reader SQLiteDataReader dataReader; // Call ExecuteReader with the appropriate CommandBehavior if (connectionOwnership == SQLiteConnectionOwnership.External) { dataReader = cmd.ExecuteReader(); } else { dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } // Detach the SQLiteParameters from the command object, so they can be used again. // HACK: There is a problem here, the output parameter values are fletched // when the reader is closed, so if the parameters are detached from the command // then the SQLiteReader can´t set its values. // When this happen, the parameters can´t be used again in other command. bool canClear = true; foreach(SQLiteParameter commandParameter in cmd.Parameters) { if (commandParameter.Direction != ParameterDirection.Input) canClear = false; } if (canClear) { cmd.Parameters.Clear(); } return dataReader; } catch { if( mustCloseConnection ) connection.Close(); throw; } }
private void SetItemTitleWords(SQLiteTransaction tx, long catId, String title) { //Tokenize the title into lower-case 'words' based on the word breaking algorithm //below, and store each word in the database along with its ordinal position in the //title String[] titleTokens = TokenizeTitle(title); using (SQLiteCommand cmd = tx.Connection.CreateCommand()) { cmd.Transaction = tx; cmd.CommandType = CommandType.Text; cmd.CommandText = "insert into catalog_item_title_words(catalog_item_id, ordinal, word_id) values(?, ?, ?)"; cmd.CreateAndAddUnnamedParameters(); cmd.Prepare(); for (int idx = 0; idx < titleTokens.Length; idx++) { cmd.Parameters[0].Value = catId; cmd.Parameters[1].Value = idx+1; cmd.Parameters[2].Value = GetWordId(titleTokens[idx], true); cmd.ExecuteNonQuery(); } } //Now, update the catalog-wide title word graph //with information from this title AddItemTitleToTitleWordGraph(catId, titleTokens); }
/// <summary> /// Execute a SQLiteCommand (that returns a resultset and takes no parameters) against the provided SQLiteTransaction. /// </summary> /// <remarks> /// e.g.: /// FillDataset(trans, CommandType.Text, "Select * from TableTransaction", ds, new string[] {"orders"}); /// </remarks> /// <param name="transaction">A valid SQLiteTransaction</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command</param> /// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> /// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced /// by a user defined name (probably the actual table name) /// </param> public static void FillDataset(SQLiteTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames) { FillDataset (transaction, commandType, commandText, dataSet, tableNames, null); }
/// <summary> /// Execute a SQLiteCommand (that returns a resultset) against the specified SQLiteTransaction /// using the provided parameters. /// </summary> /// <remarks> /// e.g.: /// FillDataset(trans, CommandType.Text, "Select * from TableTransaction where ProdId=?", ds, new string[] {"orders"}, new SQLiteParameter("@prodid", 24)); /// </remarks> /// <param name="transaction">A valid SQLiteTransaction</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command</param> /// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> /// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced /// by a user defined name (probably the actual table name) /// </param> /// <param name="commandParameters">An array of SQLiteParamters used to execute the command</param> public static void FillDataset(SQLiteTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params SQLiteParameter[] commandParameters) { FillDataset((SQLiteConnection)transaction.Connection, transaction, commandType, commandText, dataSet, tableNames, commandParameters); }
/// <summary> /// Execute a SQLiteCommand (that returns a resultset and takes no parameters) against the provided SQLiteTransaction. /// </summary> /// <remarks> /// e.g.: /// string r = ExecuteXmlReader(trans, CommandType.Text, "Select * from TableTransaction"); /// </remarks> /// <param name="transaction">A valid SQLiteTransaction</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command using "FOR XML AUTO"</param> /// <returns>An string containing the resultset generated by the command</returns> public static string ExecuteXml(SQLiteTransaction transaction, CommandType commandType, string commandText) { // Pass through the call providing null for the set of SQLiteParameters return ExecuteXml(transaction, commandType, commandText, (SQLiteParameter[])null); }
/// <summary> /// Execute a SQLiteCommand (that returns a resultset) against the specified SQLiteTransaction /// using the provided parameters. /// </summary> /// <remarks> /// e.g.: /// XmlReader r = ExecuteXmlReader(trans, CommandType.Text, "Select * from TableTransaction where ProdId=?", new SQLiteParameter("@prodid", 24)); /// </remarks> /// <param name="transaction">A valid SQLiteTransaction</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command using "FOR XML AUTO"</param> /// <param name="commandParameters">An array of SQLiteParamters used to execute the command</param> /// <returns>An XmlReader containing the resultset generated by the command</returns> public static string ExecuteXml(SQLiteTransaction transaction, CommandType commandType, string commandText, params SQLiteParameter[] commandParameters) { if( transaction == null ) throw new ArgumentNullException( "transaction" ); if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" ); // // Create a command and prepare it for execution SQLiteCommand cmd = new SQLiteCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, (SQLiteConnection)transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // Create the DataAdapter & DataSet SQLiteDataAdapter obj_Adapter =new SQLiteDataAdapter (cmd); DataSet ds=new DataSet(); ds.Locale =CultureInfo.InvariantCulture; obj_Adapter.Fill(ds); // Detach the SQLiteParameters from the command object, so they can be used again cmd.Parameters.Clear(); string retval= ds.GetXml(); ds.Clear(); obj_Adapter.Dispose (); return retval; }
/// <summary> /// Execute a SQLiteCommand (that returns a 1x1 resultset) against the specified SQLiteTransaction /// using the provided parameters. /// </summary> /// <remarks> /// e.g.: /// int orderCount = (int)ExecuteScalar(trans, CommandType.Text, "Select count(Order) from TableTransaction where ProdId=?", new SQLiteParameter("@prodid", 24)); /// </remarks> /// <param name="transaction">A valid SQLiteTransaction</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command</param> /// <param name="commandParameters">An array of SQLiteParamters used to execute the command</param> /// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> public static object ExecuteScalar(SQLiteTransaction transaction, CommandType commandType, string commandText, params SQLiteParameter[] commandParameters) { if( transaction == null ) throw new ArgumentNullException( "transaction" ); if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" ); // Create a command and prepare it for execution SQLiteCommand cmd = new SQLiteCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, (SQLiteConnection)transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // Execute the command & return the results object retval = cmd.ExecuteScalar(); // Detach the SQLiteParameters from the command object, so they can be used again cmd.Parameters.Clear(); return retval; }
/// <summary> /// Execute a SQLiteCommand (that returns a resultset) against the specified SQLiteTransaction /// using the provided parameters. /// </summary> /// <remarks> /// e.g.: /// SQLiteDataReader dr = ExecuteReader(trans, CommandType.Text, "Select Orderid from TableTransaction where ProdId=?", new SQLiteParameter("@prodid", 24)); /// </remarks> /// <param name="transaction">A valid SQLiteTransaction</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command</param> /// <param name="commandParameters">An array of SQLiteParamters used to execute the command</param> /// <returns>A SQLiteDataReader containing the resultset generated by the command</returns> public static SQLiteDataReader ExecuteReader(SQLiteTransaction transaction, CommandType commandType, string commandText, params SQLiteParameter[] commandParameters) { if( transaction == null ) throw new ArgumentNullException( "transaction" ); if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" ); // Pass through to private overload, indicating that the connection is owned by the caller return ExecuteReader((SQLiteConnection)transaction.Connection, transaction, commandType, commandText, commandParameters, SQLiteConnectionOwnership.External); }
/// <summary> /// Execute a SQLiteCommand (that returns a resultset) against the specified SQLiteTransaction /// using the provided parameters. /// </summary> /// <remarks> /// e.g.: /// DataSet ds = ExecuteDataset(trans, CommandType.Text, "Select * from TableTransaction where ProdId=?", new SQLiteParameter("@prodid", 24)); /// </remarks> /// <param name="transaction">A valid SQLiteTransaction</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command</param> /// <param name="commandParameters">An array of SQLiteParamters used to execute the command</param> /// <returns>A dataset containing the resultset generated by the command</returns> public static DataSet ExecuteDataset(SQLiteTransaction transaction, CommandType commandType, string commandText, params SQLiteParameter[] commandParameters) { if( transaction == null ) throw new ArgumentNullException( "transaction" ); if( transaction != null && transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" ); // Create a command and prepare it for execution SQLiteCommand cmd = new SQLiteCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, (SQLiteConnection)transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // Create the DataAdapter & DataSet //using( SQLiteDataAdapter da = new SQLiteDataAdapter(cmd) ) SQLiteDataAdapter da = new SQLiteDataAdapter(cmd); DataSet ds = new DataSet(); ds.Locale =CultureInfo.InvariantCulture; // Fill the DataSet using default values for DataTable names, etc da.Fill(ds); // Detach the SQLiteParameters from the command object, so they can be used again cmd.Parameters.Clear(); // Return the dataset return ds; }
/// <summary> /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters /// to the provided command /// </summary> /// <param name="command">The SQLiteCommand to be prepared</param> /// <param name="connection">A valid SQLiteConnection, on which to execute this command</param> /// <param name="transaction">A valid SQLiteTransaction, or 'null'</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command</param> /// <param name="commandParameters">An array of SQLiteParameters to be associated with the command or 'null' if no parameters are required</param> /// <param name="mustCloseConnection"><c>true</c> if the connection was opened by the method, otherwose is false.</param> private static void PrepareCommand(SQLiteCommand command, SQLiteConnection connection, SQLiteTransaction transaction, CommandType commandType, string commandText, SQLiteParameter[] commandParameters, out bool mustCloseConnection ) { if( command == null ) throw new ArgumentNullException( "command" ); if(commandType == CommandType.StoredProcedure ) throw new ArgumentException("Stored Procedures are not supported."); // If the provided connection is not open, we will open it if (connection.State != ConnectionState.Open) { mustCloseConnection = true; connection.Open(); } else { mustCloseConnection = false; } // Associate the connection with the command command.Connection = connection; // Set the command text (SQL statement) command.CommandText = commandText; // If we were provided a transaction, assign it if (transaction != null) { if( transaction.Connection == null ) throw new ArgumentException( "The transaction was rollbacked or commited, please provide an open transaction.", "transaction" ); command.Transaction = transaction; } // Set the command type command.CommandType = commandType; // Attach the command parameters if they are provided if (commandParameters != null) { AttachParameters(command, commandParameters); } return; }
/// <summary> /// Private helper method that execute a SQLiteCommand (that returns a resultset) against the specified SQLiteTransaction and SQLiteConnection /// using the provided parameters. /// </summary> /// <remarks> /// e.g.: /// FillDataset(conn, trans, CommandType.Text, "Select * from TableTransaction where ProdId=?", ds, new string[] {"orders"}, new SQLiteParameter("@prodid", 24)); /// </remarks> /// <param name="connection">A valid SQLiteConnection</param> /// <param name="transaction">A valid SQLiteTransaction</param> /// <param name="commandType">The CommandType (TableDirect, Text)</param> /// <param name="commandText">The T-SQL command</param> /// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> /// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced /// by a user defined name (probably the actual table name) /// </param> /// <param name="commandParameters">An array of SQLiteParamters used to execute the command</param> private static void FillDataset(SQLiteConnection connection, SQLiteTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params SQLiteParameter[] commandParameters) { if( connection == null ) throw new ArgumentNullException( "connection" ); if( dataSet == null ) throw new ArgumentNullException( "dataSet" ); // Create a command and prepare it for execution SQLiteCommand command = new SQLiteCommand(); bool mustCloseConnection = false; PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection ); // Create the DataAdapter & DataSet SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(command); try { // Add the table mappings specified by the user if (tableNames != null && tableNames.Length > 0) { string tableName = "Table"; for (int index=0; index < tableNames.Length; index++) { if( tableNames[index] == null || tableNames[index].Length == 0 ) throw new ArgumentException( "The tableNames parameter must contain a list of tables, a value was provided as null or empty string.", "tableNames" ); dataAdapter.TableMappings.Add(tableName, tableNames[index]); tableName += (index + 1).ToString(); } } // Fill the DataSet using default values for DataTable names, etc dataAdapter.Fill(dataSet); // Detach the SQLiteParameters from the command object, so they can be used again command.Parameters.Clear(); if( mustCloseConnection ) connection.Close(); } finally { dataAdapter.Dispose(); } }