- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
Хочу получить последнее добавленное числовое значения из одной ячейке таблицы
Создал таблицу с полями:
[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 шт):
В реляционных базах данных нет такого понятия, как "последнее добавленное значение", потому что порядок строк не определён.
Чтобы получить последнюю строку нужно использовать сортировку по какому-либо полю. Возьмём для этого 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;
}