Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2010, 10:08   #1
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию Удаление записи из таблицы с помощю процедуры firebird

Здраствуйте
перед мной токая задача: надо удалить ряд из DBGridEh используя процедуру БД

код процедуры
Код:
create or alter procedure name (
    ID integer)
as
begin
  /* Procedure Text */
  delete from "table" where id = :id;
  suspend;
end^
далее в делфи делаю так

Код:
DataModule2.IBQuery2.SQL.Clear;
DataModule2.IBQuery2.SQL.Add('execute procedure name (:id)');
DataModule2.IBQuery2.ParamByName('id').Value := DBGridEh1.Fields[0].Value;
DataModule2.IBQuery2.ExecSQL;
что я не правельно зделал ато при нажатие батана удалить вылетает ошибка "Acces Violation"
postaveche вне форума Ответить с цитированием
Старый 08.09.2010, 10:27   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так, на первый взгляд, вроде бы всё нормально.
Только я бы переименовал процедуру. т.к. использованное вами слово может быть и ключевым.. да и не отражает сущность процедуры.
Назовите её, например, create or alter procedure DeleteById
это раз.

Второе. Вы что, таблице дали имя table ?!!! Это уж точно зря! Рекомендую переименовать! Если совсем уж с фантазией туго, тогда хотя бы циферки в конце имени добавьте.

Но, к сожалению, на 99% к возникающей ошибке Access Violation всё вышесказанное отношения не имеет!

Для отладки попробуйте поставить точку останова на операторе
DataModule2.IBQuery2.SQL.Clear;
и потом пошагово по F8 проходите, смотрите, на какой строке произойдёт AccessViolation

а потому, в зависимости от того, что это за строчка - и принимайте дальнейшие действия.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.09.2010, 10:47   #3
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

рискну предположить, что причина в IBQuery, т.к. он (как правило) не используется для таких целей. Для работы с хранимыми процедурами есть спец компонент: IBStoredProc
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 08.09.2010, 10:52   #4
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
так, на первый взгляд, вроде бы всё нормально.
Только я бы переименовал процедуру. т.к. использованное вами слово может быть и ключевым.. да и не отражает сущность процедуры.
Назовите её, например, create or alter procedure DeleteById
это раз.

Второе. Вы что, таблице дали имя table ?!!! Это уж точно зря! Рекомендую переименовать! Если совсем уж с фантазией туго, тогда хотя бы циферки в конце имени добавьте.

Но, к сожалению, на 99% к возникающей ошибке Access Violation всё вышесказанное отношения не имеет!

Для отладки попробуйте поставить точку останова на операторе
DataModule2.IBQuery2.SQL.Clear;
и потом пошагово по F8 проходите, смотрите, на какой строке произойдёт AccessViolation

а потому, в зависимости от того, что это за строчка - и принимайте дальнейшие действия.
имя таблицы и процедуры друге ... это я тут просто так написал
postaveche вне форума Ответить с цитированием
Старый 08.09.2010, 11:00   #5
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Что еще вы написали "просто так"? Если хотите помощи - пишите реальный код
_Engine_ вне форума Ответить с цитированием
Старый 08.09.2010, 11:00   #6
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию

Цитата:
Сообщение от Yurk@ Посмотреть сообщение
рискну предположить, что причина в IBQuery, т.к. он (как правило) не используется для таких целей. Для работы с хранимыми процедурами есть спец компонент: IBStoredProc
в документации ibase написанно что можно и так

обрамление списка параметров круглыми скобками необязательно, но желательно.

Код:
IBQuery1.SQL.Clear; 
IBQuery1.SQL.Add('execute procedure test (:param1)');
IBQuery1.ParamByName('param1').asInteger:=5;
IBQuery1.ExecQuery; 

IBStoredProc1.StoredProcName:='test';
IBStoredProc1.ParamByName('param1').asInteger:=5;
IBStoredProc1.ExecProc;
postaveche вне форума Ответить с цитированием
Старый 08.09.2010, 11:01   #7
quit
Я есть!
Форумчанин
 
Аватар для quit
 
Регистрация: 17.02.2008
Сообщений: 318
По умолчанию

предложу такой вариант:
Код:
DataModule2.IBQuery2.SQL.Clear;
DataModule2.IBQuery2.SQL.Add('execute procedure name (:id);');
DataModule2.IBQuery2.ParamByName('id').AsInteger:= DBGridEh1.Fields[0].AsInteger;
DataModule2.IBQuery2.ExecSQL;
то есть привести сразу к Int
©Учиться, учиться и еще раз учиться!
quit вне форума Ответить с цитированием
Старый 08.09.2010, 11:02   #8
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию

Цитата:
Сообщение от _Engine_ Посмотреть сообщение
Что еще вы написали "просто так"? Если хотите помощи - пишите реальный код
ну есле это вам поможет то пожалуста

Код:
create or alter procedure DEL_ALG_SPECII (
    ID integer)
as
begin
  /* Procedure Text */
  delete from "ALG_SPECII" where id = :id;
  suspend;
end^
delphi

Код:
procedure TFrame6.Button4Click(Sender: TObject);
begin
DataModule2.IBQuery2.SQL.Clear;
DataModule2.IBQuery2.SQL.Add('execute procedure DEL_ALG_SPECII (:id)');
DataModule2.IBQuery2.ParamByName('id').Value := DBGridEh1.Fields[0].Value;
DataModule2.IBQuery2.ExecSQL;

end;
postaveche вне форума Ответить с цитированием
Старый 08.09.2010, 11:04   #9
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Чему равно DBGridEh1.Fields[0].Value;
?
_Engine_ вне форума Ответить с цитированием
Старый 08.09.2010, 11:07   #10
postaveche
Пользователь
 
Регистрация: 30.08.2010
Сообщений: 77
По умолчанию

Цитата:
Сообщение от quit Посмотреть сообщение
предложу такой вариант:
Код:
DataModule2.IBQuery2.SQL.Clear;
DataModule2.IBQuery2.SQL.Add('execute procedure name (:id);');
DataModule2.IBQuery2.ParamByName('id').AsInteger:= DBGridEh1.Fields[0].AsInteger;
DataModule2.IBQuery2.ExecSQL;
то есть привести сразу к Int
Попробовал так ... всеравно ругается

Access Violation at address 0058D4E7 in module 'Project1.exe' Read of address 00000000
postaveche вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заполнить DBLookupComboBoxEh из таблицы firebird postaveche Помощь студентам 16 03.09.2010 18:46
Получить хранимые процедуры FireBird из Delphi gremland БД в Delphi 2 30.06.2010 18:43
добавление записи firebird alex_-87 БД в Delphi 1 03.01.2010 16:45
Блокировка записи в FireBird denisbobrov3 БД в Delphi 1 02.01.2010 01:06
Firebird.pFIBQuery.Вставка записи artemavd БД в Delphi 45 28.12.2009 18:47