Страница 15 из 18

Re: БД (Delphi)

Добавлено: 14 апр 2012, 17:50
Andrey
Проверку делать не обязательно, если точно известно что при запуске соединение произошло. Это относится только к MS Access, для более серьёзных проверка требуется.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 17:52
Maximus
Ясно.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 18:44
Maximus
Код выполняется, поле rank увеличивается, но в тоже время срабатывает исключение.
Выполнение кода обрывается на строке Form1.ADOQuery1.Parameters.ParamByName('v').Value:=s;
Form1.ADOQuery1.Active:=True; уже не выполняется.
Из-за чего так?

Код: Выделить всё

procedure SetPlayerRank(s: ShortString);
begin
  try
    Form1.ADOQuery1.SQL.Clear;
    Form1.ADOQuery1.SQL.Add('UPDATE Score SET rank=rank+1 WHERE name=:v');
    Form1.ADOQuery1.Parameters.ParamByName('v').Value:=s;
    Form1.ADOQuery1.Active:=True;
  except
    printf('Ошибка при запросе установления ранга игроку');
  end; 
end;

Re: БД (Delphi)

Добавлено: 14 апр 2012, 18:55
Andrey
1. Такие конструкции нормально работают в Access? А то когда говорил про такой способ инкремента не учитывал различные особенности этой БД.

Код: Выделить всё

rank=rank+1
2. В s есть что-то?
Странно то что Form1.ADOQuery1.Active:=True; не выполняется, а rank увеличивается. Без выполнения той команды это невозможно.
Попробуй ещё такой вариант:

Код: Выделить всё

procedure SetPlayerRank(s: ShortString);
begin
  try
    Form1.ADOQuery1.SQL.Clear;
    Form1.ADOQuery1.SQL.Add('UPDATE Score SET rank=rank+1 WHERE name='+s);
    Form1.ADOQuery1.Active:=True;
  except
    printf('Ошибка при запросе установления ранга игроку');
  end; 
Что в delphi делает printf? Эта команда есть во многих языках, но здесь не помню.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 19:08
Maximus
Andrey писал(а):1. Такие конструкции нормально работают в Access? А то когда говорил про такой способ инкремента не учитывал различные особенности этой БД.

Код: Выделить всё

rank=rank+1
Ну судя по тому что значение изменяется, то работает.
Andrey писал(а):2. В s есть что-то?
Странно то что Form1.ADOQuery1.Active:=True; не выполняется, а rank увеличивается. Без выполнения той команды это невозможно.
Попробуй ещё такой вариант:

Код: Выделить всё

procedure SetPlayerRank(s: ShortString);
begin
  try
    Form1.ADOQuery1.SQL.Clear;
    Form1.ADOQuery1.SQL.Add('UPDATE Score SET rank=rank+1 WHERE name='+s);
    Form1.ADOQuery1.Active:=True;
  except
    printf('Ошибка при запросе установления ранга игроку');
  end; 
В s есть строка. С таким вариантом всё тоже самое, за исключением того, что значение поля не увеличивается.
Andrey писал(а):Что в delphi делает printf? Эта команда есть во многих языках, но здесь не помню.
Это моя процедура по логированию ошибок. Кстати почему-то print не захотела добавлять, как буд-то уже есть. :D

Re: БД (Delphi)

Добавлено: 14 апр 2012, 19:15
Andrey
А если Form1.ADOQuery1.Active:=True; заменить на Form1.ADOQuery1.Open;? Хотя если ошибка раньше то не поможет.
Maximus писал(а):Это моя процедура по логированию ошибок. Кстати почему-то print не захотела добавлять, как буд-то уже есть
print есть у формы, поэтому и не добавила. Спросил только потому что первое что увидел в том фрагменте кода - printf, подумал что ты решил перейти с delphi на си. :D

Re: БД (Delphi)

Добавлено: 14 апр 2012, 19:46
Maximus
Andrey писал(а):А если Form1.ADOQuery1.Active:=True; заменить на Form1.ADOQuery1.Open;? Хотя если ошибка раньше то не поможет.
Form1.ADOQuery1.Open; не помог.
Andrey писал(а):
Maximus писал(а):Это моя процедура по логированию ошибок. Кстати почему-то print не захотела добавлять, как буд-то уже есть
print есть у формы, поэтому и не добавила. Спросил только потому что первое что увидел в том фрагменте кода - printf, подумал что ты решил перейти с delphi на си. :D
Плавный переход :D

Re: БД (Delphi)

Добавлено: 14 апр 2012, 19:49
Andrey
А какой текст исключения? Код выполняется как надо и всегда?
Maximus писал(а):Плавный переход :D
Если вдруг чем-то си понравится, учитывай что он сложнее.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 19:59
Maximus
Andrey писал(а):А какой текст исключения? Код выполняется как надо и всегда?
Как бы его посмотреть, автоматически никаких окон не появляется с ошибками. Плагин просто падает, если убрать try except
Что значит выполняется как надо? Выполняется ведь только часть и данные не обновляются в БД, если конечно не использовать ADOQuery1.Parameters.ParamByName.
Andrey писал(а): Если вдруг чем-то си понравится, учитывай что он сложнее.
Само собой :D
Просто привык к синтаксису си, скрипты в САМП именно на на нём, да и с ява знаком немного.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 20:03
Andrey
Maximus писал(а): Как бы его посмотреть, автоматически никаких окон не появляется с ошибками.
Режим отладки. Тогда появится окно с сообщением.
Maximus писал(а): Выполняется ведь только часть и данные не обновляются в БД
Тогда как ты понял что rank увеличивается?
Maximus писал(а):Просто привык к синтаксису си, скрипты в САМП именно на на нём, да и с ява знаком немного.
Все они чем-то похожи, а си, ява, C#, php особенно сильно близки.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 20:05
Maximus
rank увеличивается если написать так

Код: Выделить всё

Form1.ADOQuery1.SQL.Add('UPDATE Score SET rank=rank+1 WHERE name=:v');
Form1.ADOQuery1.Parameters.ParamByName('v').Value:=s;
Form1.ADOQuery1.Active:=True;
и не увеличивается если так

Код: Выделить всё

Form1.ADOQuery1.SQL.Add('UPDATE Score SET rank=rank+1 WHERE name='+s);
 Form1.ADOQuery1.Active:=True;

Re: БД (Delphi)

Добавлено: 14 апр 2012, 20:07
Maximus
Andrey писал(а): Режим отладки. Тогда появится окно с сообщением.
Я уже забыл как его для чата настроить :D

Re: БД (Delphi)

Добавлено: 14 апр 2012, 20:11
Andrey
Ну оставляем первый вариант. Я так и не понял, в данном случае увеличивается rank, записывается в БД и вылетает исключение? Или не так?
Я уже забыл как его для чата настроить
Минут через 20 напишу, когда виртуалку с delphi восстановлю, а то она 5 минут назад перешла в режим бесконечной перезагрузки.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 20:13
Maximus
В первом случае запись в БД происходит, но исключение всё равно срабатывает, во втором случае запись в БД не происходит и так же срабатывает исключение.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 20:14
Andrey
Когда напишу как отладку сделать, посмотришь что за исключение. Пока его причину понять сложно.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 20:41
Andrey
Включение отладки.
Меню Project - Options. Слева выбрать Delphi Compiler. В пункте Output Diectory (желательно во все 3 пункта) записать путь до того места где будет лежать файл плагина. Например

Код: Выделить всё

C:\Program Files (x86)\CommFort_server\Plugins\
Затем слева выбрать "Debugger". Пункт Host Application - исполняемый файл коммфорта

Код: Выделить всё

C:\Program Files (x86)\CommFort_server\CommFort_server.exe
Пункт Working Directory - папка с коммфортом

Код: Выделить всё

C:\Program Files (x86)\CommFort_server
Внимание! {$LIBVERSION 'cfplug'} может исчезнуть, надо будет восстановить.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 21:01
Maximus
Никаких сообщений. Только при первом запуске в режиме отладки было очень много сообщений с кодами ошибок, но при самом обращении ничего. А сейчас запускаю, так и при запуске никаких ошибок.

Re: БД (Delphi)

Добавлено: 14 апр 2012, 21:03
Andrey
То есть исключение срабатывает но подробностей нет?

Re: БД (Delphi)

Добавлено: 14 апр 2012, 21:08
Maximus
Нету. Если убрать обработку исключений тоже ничего. Чтобы остановить запуск просто закрываем сервер или нужно как-то по-другому?

Re: БД (Delphi)

Добавлено: 14 апр 2012, 21:10
Andrey
Закрыть сервер или нажать кнопку остановки. Только вот странно почему не показыается, обычно о любом исключении сообщается.