WP8/C#/SQLite: get last inserted id? WP8/C#/SQLite: get last inserted id? sqlite sqlite

WP8/C#/SQLite: get last inserted id?


Your SELECT last_insert_rowid() call does not work because you are running it in a different database connection.

Anyway, you should just read the ID from the inserted ShoppingItem object, like this:

var si = new ShoppingItem() {  Name = anItem,  Shop = aShop,  isActive = aIsActive,};db.Insert(si);return si.Id;


This is what i do to retrieve the id of the last inserted item. The provided code snippet works in my Windows 8 App using SQLite 3.7.XX (SQLite).

    public class ExpenseDataMapper    {        SQLiteConnection connection;        /// <summary>        /// Constructor        /// </summary>        public ExpenseDataMapper()        {            connection = new SQLiteConnection(StaticResources.DATABASE_PATH_NAME);            connection.CreateTable<FinancialListBoxExpenseItem>();        }        /// <summary>        /// Method #1: Inserts an FinancialListBoxExpenseItem into Database        /// </summary>        /// <param name="item"></param>        /// <returns>Primary key of inserted item</returns>        public int insertExpenseItem(FinancialListBoxExpenseItem item)        {            int primaryKey = 0;            connection.RunInTransaction(() =>                            {                                connection.Insert(item);                                primaryKey = item.expenseID;                            });            return primaryKey;        }    /// <summary>    /// Method #2: Inserts an FinancialListBoxExpenseItem into Database    /// </summary>    /// <param name="item"></param>    /// <returns>Primary key of inserted item</returns>    public int insertExpenseItem2(FinancialListBoxExpenseItem item)    {        int primaryKey = 0;        connection.RunInTransaction(() =>                        {                            connection.Insert(item);                            primaryKey = connection.ExecuteScalar<int>("SELECT last_insert_rowid()");                        });        return primaryKey;    }}

The id property in the FinancialListBoxItem class looks like this:

 public class FinancialListBoxExpenseItem : Money.Common.BindableBase    {        private int _expenseID = 0;        [AutoIncrement, PrimaryKey]        public int expenseID        {            get            {                return _expenseID;            }            set            {                this.SetProperty<int>(ref _expenseID, value);            }        }}

I would recommend that you choose a different name for your pk column 'Id'. I don't know if Id is something like an internal keyword. EDIT: Okay it is not a SQLite keyword but id isn't a proper name anyway (Source: SQLite Keywords)


   public List<int[]> CreateSymbolByName(string SymbolName, bool AcceptDuplicates)    {        if (! AcceptDuplicates)  // check if "AcceptDuplicates" flag is set        {            List<int[]> ExistentSymbols = GetSymbolsByName(SymbolName, 0, 10); // create a list of int arrays with existent records            if (ExistentSymbols.Count > 0) return ExistentSymbols; //(1) return existent records because creation of duplicates is not allowed        }        List<int[]> ResultedSymbols = new List<int[]>();  // prepare a empty list        int[] symbolPosition = { 0, 0, 0, 0 }; // prepare a neutral position for the new symbol        try // If SQL will fail, the code will continue with catch statement        {            //DEFAULT und NULL sind nicht als explizite Identitätswerte zulässig            string commandString = "INSERT INTO [simbs] ([En]) OUTPUT INSERTED.ID VALUES ('" + SymbolName + "') "; // Insert in table "simbs" on column "En" the value stored by variable "SymbolName"            SqlCommand mySqlCommand = new SqlCommand(commandString, SqlServerConnection); // initialize the query environment                SqlDataReader myReader = mySqlCommand.ExecuteReader(); // last inserted ID is recieved as any resultset on the first column of the first row                int LastInsertedId = 0; // this value will be changed if insertion suceede                while (myReader.Read()) // read from resultset                {                    if (myReader.GetInt32(0) > -1)                     {                        int[] symbolID = new int[] { 0, 0, 0, 0 };                        LastInsertedId = myReader.GetInt32(0); // (2) GET LAST INSERTED ID                        symbolID[0] = LastInsertedId ; // Use of last inserted id                        if (symbolID[0] != 0 || symbolID[1] != 0) // if last inserted id succeded                        {                            ResultedSymbols.Add(symbolID);                        }                    }                }                myReader.Close();            if (SqlTrace) SQLView.Log(mySqlCommand.CommandText); // Log the text of the command            if (LastInsertedId > 0) // if insertion of the new row in the table was successful            {                string commandString2 = "UPDATE [simbs] SET [IR] = [ID] WHERE [ID] = " + LastInsertedId + " ;"; // update the table by giving to another row the value of the last inserted id                SqlCommand mySqlCommand2 = new SqlCommand(commandString2, SqlServerConnection);                 mySqlCommand2.ExecuteNonQuery();                symbolPosition[0] = LastInsertedId; // mark the position of the new inserted symbol                ResultedSymbols.Add(symbolPosition); // add the new record to the results collection            }        }        catch (SqlException retrieveSymbolIndexException) // this is executed only if there were errors in the try block        {            Console.WriteLine("Error: {0}", retrieveSymbolIndexException.ToString()); // user is informed about the error        }    CreateSymbolTable(LastInsertedId); //(3) // Create new table based on the last inserted id    if (MyResultsTrace) SQLView.LogResult(LastInsertedId); // log the action    return ResultedSymbols; // return the list containing this new record}