Хочу получить последнее добавленное числовое значения из одной ячейке таблицы

Создал таблицу с полями:

 [Table("structuraTabl")]
 public class StructuraTabl
 {
     [PrimaryKey]
     [AutoIncrement]
     [Column("id")]
     public int ID{ get; set; }

     [Column("datasozd")]
     public string Datasozd{ get; set; }

     [Column ("cena")]
     public int Cena{ get; set; }
 }

Далее я создал и подключился к БД:

 public class Service
 {
     private const string DB_NAME= "BazaDannih.db3";
     public readonly SQLiteAsyncConnection _connection;

     public Service()
     {
         _connection = new SQLiteAsyncConnection(Path.Combine(FileSystem.AppDataDirectory, DB_NAME));

         _connection.CreateTableAsync<StructuraTabl>();
     }

Ну и начал заполнять таблицу. Цель моей программы это производить сложения последнего добавленного значения в ячейке "Cena" на введенную сумму и для этого мне надо как-то обратиться к последней записи "Cena".

Использую библиотеку SQLite-net.


Ответы (1 шт):

Автор решения: Alexander Petrov

В реляционных базах данных нет такого понятия, как "последнее добавленное значение", потому что порядок строк не определён.

Чтобы получить последнюю строку нужно использовать сортировку по какому-либо полю. Возьмём для этого Datasozd, т. к. судя по названию, это дата создания. При этом это значение должно быть сортируемым. Какое оно у вас - мне неведомо...
Ну или используйте ID.


Первый способ - в стиле ORM. Получаем из БД запись, меняем ее, сохраняем в БД. Соответственно, тут используются два SQL-запроса: select и update.

public async Task<int> Update(int value)
{
    var item = await _connection.Table<StructuraTabl>()
        .OrderByDescending(x => x.Datasozd)
        .FirstAsync();

    item.Cena += value;

    int rowsUpdated = await _connection.UpdateAsync(item);
    return rowsUpdated;
}

Второй способ - чистый SQL. Его достоинство в том, что используется всего один запрос. Это существенно быстрее.

public async Task<int> UpdateSql(int value)
{
    string sql = """
        update structuraTabl
        set cena = cena + ?
        where datasozd = (select max(datasozd) from structuraTabl)            
        """;

    int rowsModified = await _connection.ExecuteAsync(sql, value);
    return rowsModified;
}
→ Ссылка