6

WP8を使用したSQLiteは私を夢中にさせています。:(

私がしたいのは、最後に挿入されたIDの値を取得することだけです...

私が持っている:

class ShoppingItem
{
  [SQLite.PrimaryKey, SQLite.AutoIncrement]
  public int Id {get; set;}
  public string Name {get; set;}
  public string Shop {get; set;}
  public bool isActive {get; set;}
}

まあ、使用されたSQLiteConnectionオブジェクトもそのオブジェクトもTable<ShoppingItem>、最後の ID を含む適切なメンバーを含んでいないようです。

だから私はやろうとした:

private int GetLastInsertedRowID()
{
  int Result = -1;
  using (var db = new SQLiteConnection(m_DatabasePath)) {
    Result = db.ExecuteScalar<int>("SELECT last_insert_rowid();");
  }
  return Result;
}

しかし、この関数は常に を返します0。:(しかし、のすべてのエントリを読み取るとShoppingItem、それらの ID の値は != 0 になります。

私の質問は次のとおりです:最後に挿入されたIDを取得するにはどうすればよいですか?

PS: SQL クエリを に変更してもSELECT last_insert_rowid() FROM ShoppingItem;、同じ結果が得られました。

PPS: C# で SQLite.NET を使用して最後の挿入 ID を取得するようなソリューションはコンパイルされません。明らかに古いバージョンの SQLite が使用されており、まったく異なる API が使用されています。

4

3 に答える 3

11

別のデータベース接続SELECT last_insert_rowid()で実行しているため、呼び出しが機能しません。

とにかく、次のShoppingItemように、挿入されたオブジェクトから ID を読み取る必要があります。

var si = new ShoppingItem() {
  Name = anItem,
  Shop = aShop,
  isActive = aIsActive,
};
db.Insert(si);
return si.Id;
于 2013-03-18T14:56:13.783 に答える
0

これは、最後に挿入されたアイテムの ID を取得するために行うことです。提供されたコード スニペットは、SQLite 3.7.XX ( SQLite ) を使用して Windows 8 アプリで動作します。

    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;
    }
}

FinancialListBoxItem クラスの id プロパティは次のようになります。

 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);
            }
        }
}

pk 列「Id」には別の名前を選択することをお勧めします。Id が内部キーワードのようなものかどうかはわかりません。編集: SQLite キーワードではありませんが、とにかく id は適切な名前ではありません (出典: SQLite キーワード)

于 2013-03-18T13:43:21.093 に答える
-1
   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
}
于 2014-11-10T05:57:10.273 に答える