2013-03-18 15 views
6

WP8'li SQLite beni deli ediyor.WP8/C#/SQLite: son eklenen kimliği aldınız mı?

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

Eh, ne SQLiteConnection nesne kullanılır ne de Table<ShoppingItem>: :(

yapmak istediğim tüm son eklenen id değerini almak için ...

bende geçen kimliği içeren uygun bir üyeyi ihtiva ettiği görülmektedir

yüzden yapmaya çalıştım.

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

Ancak bu işlev her zaman 0 değerini döndürür. Ben ShoppingItem tüm girdileri okurken :( Fakat, onların kimlikleri değerlere sahip = 0.

Yani benim soru:! Ben son eklenen kimliği Retreive nasıl

Not:? SQL sorgusu değiştirme için SELECT last_insert_rowid() FROM ShoppingItem; aynı sonucu verdi

PPS:. Getting the Last Insert ID with SQLite.NET in C# gibi çözümler görünüşte kullanılan eski bir sürümü SQLite tamamen farklı API

+0

db.ExecuteScalar olan ("() LAST_INSERT_ROWID SEÇ"); Çalışma? (Yok; sorgunun sonunda) – Joel

+0

no, noktalı virgülle veya noktalı virgülle aynı sonuç yok :( –

+0

pk sütunu'nuz için farklı bir ad seçmenizi öneririm 'Id'. Kimlik gibi bir şey olup olmadığını bilmiyorum iç anahtar kelime. Ama ben sadece burada tahmin ediyorum. – Joel

cevap

11

bir farklı veritabanı bağlantılı olarak çalışan çünkü SELECT last_insert_rowid() çağrı çalışmaz.

neyse, aynen bu şekilde, eklenen ShoppingItem nesneden kimliğini okumalısınız:

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

ah, Tamam, yeni bağlantı prob Ancak, yeni taktığım nesneden kimliği nasıl okuyabilirim? –

+0

güncellenmiş çözümüme bir göz atın (Yöntem: insertExpenseItem2) Sorgu bir işlem içine kapsüllenmiş ve bu nedenle aynı veritabanı bağlantısını kullanır – Joel

+0

Çok teşekkür ederim Maalesef "yeni" SQLite ile ilgili herhangi bir iyi doküman bulamadım. –

0

Bu ile, orada, derleme yok ben son eklenen öğenin kimliği almak için ne olduğunu Sağlanan kod snippet'i Wi'imde çalışıyor ndows 8 App kullanarak 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; 
    } 
} 

FinancialListBoxItem sınıfında id özelliği şuna benzer:

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

ben size pk sütununda 'Kimliği' için farklı bir ad seçmeniz tavsiye ederim. Kimlik, dahili bir anahtar kelime gibi bir şey olup olmadığını bilmiyorum. DÜZENLEME: Tamam bu bir SQLite anahtar kelime değildir, ancak kimlik zaten (Kaynak: SQLite Keywords) uygun bir isim değil

-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 
} 
İlgili konular