2013-03-18 17 views
6

WP8のSQLiteは私をナットにしています。 :(WP8/C#/ SQLite:最後に挿入されたIDを取得しますか?

私がやりたいことのすべては、最後に挿入、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:?SELECT last_insert_rowid() FROM ShoppingItem;にSQLクエリを変更します同じ結果を与えた

PPS:Getting the Last Insert ID with SQLite.NET in C#のようなソリューションが明らかに使用され、古いバージョンのSQLiteは全く異なるAPI

+0

がdb.ExecuteScalar である( "()last_insert_rowid SELECT");ワーキング? (クエリーの最後にはありません) – Joel

+0

セミコロンの有無にかかわらず同じ結果( –

+0

あなたのpk列 'Id'に別の名前を選択することをお勧めします。内部キーワード。 – Joel

答えて

11

あなたは異なるデータベース接続でそれを実行しているので、あなたのSELECT last_insert_rowid()呼び出しが動作しません。

とにかく、あなただけのように、挿入ShoppingItemオブジェクトからIDをお読みください:

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

ああ、新しい接続はprobです しかし、挿入したばかりのオブジェクトからIDを読み取るにはどうすればよいですか? –

+0

私の更新された解決策(メソッド:insertExpenseItem2)を見てください。クエリはトランザクションにカプセル化され、同じデータベース接続を使用します – Joel

+0

非常にありがとうございます、残念ながら私は "新しい" SQLiteの良いドキュメントを見つけることができませんでした。 –

0

これは、と、そこにある、コンパイルしないでください、私は最後に挿入項目のIDを取得するために何をすべきかです提供されたコードスニペットは私のWiで動作しますSQLite 3.7.XX(SQLite)を使用して8つのアプリケーションをndowsします。

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が内部のキーワードのようなものかどうかは分かりません。 EDIT:さて、それは、SQLiteのキーワードではなく、idがとにかく(出典:SQLite Keywords)適切な名前ではありません

-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 
} 
関連する問題