Проблема при работе с базами данных в Delphi

компьютеры базы данных sql Delphi запрос

Нужно сделать так, чтобы каждый раз при вводе имени игрока программа проверяла, есть ли он уже в базе данных: если да, то кол-во сыгранных им игр увеличивается на 1, если нет - добавляется новая запись. Но выходит так, что, если программу не закрывать и регистрировать несколько имен подряд, они в любом случае добавляются как новые записи, даже если они уже присутствуют в базе. Если программу запустить заново, то при вводе тех же имен, проверка уже будет проходить нормально. То есть, если за одну сессию программы вводить одно и то же имя - оно будет постоянно создавать новую запись :( Я в этом деле новичок, так что надеюсь на вашу помощь.

Работаю с Delphi 7 и базами данных .mdb, созданных на Access 2007.

Код:
plr1_name := InputBox('Введите имя 1-го игрока', '', '');
while plr1_name = '' do begin ShowMessage('Вы должны ввести имя!'); plr1_name := InputBox('Введите имя 1-го игрока', '', ''); end;
if tbl_player.Locate('Имя', plr1_name, [])
then begin
qry_player.SQL.Clear;
qry_player.SQL.Add('UPDATE player');
qry_player.SQL.Add('SET [Кол-во игр] = [Кол-во игр] + 1');
qry_player.SQL.Add('WHERE [Имя] = :plr_name');
qry_player.Parameters.ParamByName('plr_name').Value := plr1_name;
qry_player.ExecSQL;
end
else begin
qry_player.SQL.Clear;
qry_player.SQL.Add('INSERT INTO player([Имя], [Кол-во игр], [Кол-во выигрышей])');
qry_player.SQL.Add('VALUES(:plr_name, 1, 0)');
qry_player.Parameters.ParamByName('plr_name').Value := plr1_name;
qry_player.ExecSQL;
end;
Ответы:
перед инсертом можно делать селект с фильтром по имени
если кол-во записей 0, то вставлять новую запись с постом изменений в базу и обновлением списка
Удачи =)
Вообще-то такие вещи нужно делать в БД на уровне триггеров.
Но в любом случае сначала делается Select * from Player where [Имя]=plr_name1
Если запрос не возвращает значение - то вставить запись, если возвращает - то update
Только проблема будет в том, что такой код будет создавать мусор в БД и очень много
Для начала - а кто транзакцию закрывать будет? У тебя она закрывается путем закрытия программы, а нужно в программе, ну хотя бы qry_playe.Close
Во вторых, если ты работаешь в дельфи, то используй Firebird количество проблем уменьшится на порядок


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.