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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2014, 21:56   #1
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию Добавление записи через StoredProc

Здравствуйте .
Есть SQL Server 2008 и Delphi 7.
В SQL Server Manager создал 2 таблицы, связал их и создал представление.

Чтобы добавлять записи в таблицы были созданы 2 хранимые процедуры MAX_PROJECT и ADD_PROJ:
Код:
ALTER PROCEDURE [dbo].[MAX_PROJECT]
@mxm BIGINT OUTPUT
AS
BEGIN
SELECT @mxm=MAX(id_pr) from my_project
SET @mxm=ISNULL(@mxm,1)
END

ALTER PROCEDURE [dbo].[ADD_PROJ]
@n_id_prj      BIGINT,
@n_name        VARCHAR(50),
@n_client      VARCHAR(30),
@n_cost        MONEY,
@n_d_begin     DATE,
@n_d_end       DATE,
@n_manager     VARCHAR(40), 
@n_partakers   VARCHAR(100)
AS BEGIN 
  INSERT INTO MY_PROJECT(ID_PR,name_pr,client,cost,date_begin,date_end,is_manager)
                 VALUES (@n_id_prj,@n_name,@n_client,@n_cost,@n_d_begin,@n_d_end,@n_manager) 
  INSERT INTO PARTAKERS(ID_PR,partakers)
                VALUES (@n_id_prj,@n_partakers)                     
END
В делфи кинул на форму DBGrid+ADOTable+DataSource для просмотра и вписывания записи и StoredProc для 2 хранимок.

Для добавления записи вызываю ADOTable.Append, вписываю в DBGrid данные и нажимаю ENTER и происходит следующее:
Код:
procedure save_changes(var My_Table:TADOTable;My_Grid:TDBGrid);
begin
Form1.ADOConnection1.BeginTrans;
if My_Table.Modified then  My_Table.Post;
Form1.ADOConnection1.CommitTrans;
My_Table.Close;
My_Table.Open;
My_Grid.Refresh;
end;

procedure TForm1.Grid_projectKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var id_prj:string;
begin
 if key=VK_RETURN then
  begin

   Grid_project.SelectedIndex:=0;
   ADOStoredProc1.ProcedureName:='MAX_PROJECT;1';
   ADOStoredProc1.Parameters.Refresh;
   ADOStoredProc1.Parameters.Items[1].direction:=TParameterDirection(2);
   ADOStoredProc1.ExecProc;
   id_prj:=ADOStoredProc1.Parameters.ParamValues['@mxm'];

   ADOStoredProc1.ProcedureName:='ADD_PROJ;1';
   ADOStoredProc1.Parameters.Refresh;
   ADOStoredProc1.Parameters.ParamValues['@n_id_prj']:=id_prj;
   ADOStoredProc1.Parameters.ParamValues['@n_name']:=Grid_project.Fields[0].AsString;
   ADOStoredProc1.Parameters.ParamValues['@n_client']:=Grid_project.Fields[1].AsString;
   ADOStoredProc1.Parameters.ParamValues['@n_cost']:=Grid_project.Fields[2].AsString;
   ADOStoredProc1.Parameters.ParamValues['@n_d_begin']:=Grid_project.Fields[3].AsString;
   ADOStoredProc1.Parameters.ParamValues['@n_d_end']:=Grid_project.Fields[4].AsString;
   ADOStoredProc1.Parameters.ParamValues['@n_manager']:=Grid_project.Fields[5].AsString;
   ADOStoredProc1.Parameters.ParamValues['@n_partakers']:=Grid_project.Fields[6].AsString;
   T_view_project.Cancel;
   ADOStoredProc1.ExecProc;
   save_changes(T_view_project,Grid_project);
  end;
end;
При попытке добавить данные, получаю Access Violation при выполнении какой-то функции в sqloledb.dll при выполнении помеченной строчке в коде.
Что может быть? Заранее спасибо.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 24.03.2014, 22:05   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Может быть это мешает?
Цитата:
Код:
T_view_project.Cancel;
Кстати, T_view_project - это, что за "зверь" такой? Поясните, что это, что бы можно было сказать точнее.
Streletz вне форума Ответить с цитированием
Старый 24.03.2014, 22:10   #3
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

T_view_project:ADOTable, привязанная к DBGrid.
Не, cancel тут не причем.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 24.03.2014, 22:18   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

А, что написано в сообщении ошибке?
Streletz вне форума Ответить с цитированием
Старый 24.03.2014, 22:29   #5
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Обычный Access Violation. Что-то типа : Access violation по адресу такому-то при выполнении sqloledb.dll. Какой-то другой адрес не может быть read.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 24.03.2014, 22:30   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. Покажите код создания таблиц и связей между ними.
2. Не понятно вообще зачем таблица PARTAKERS - единственное её информационное поле можно просто поместить в таблицу MY_PROJECT
Цитата:
Не, cancel тут не причем.
Не факт. Может на нем и есть ошибка. Или думаете, что ADOTable без провайдера работает? В пошаговой трассировке точно локализуйте строку, на которой ошибка вываливается
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.03.2014 в 22:38.
Аватар вне форума Ответить с цитированием
Старый 25.03.2014, 01:14   #7
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
Покажите код создания таблиц и связей между ними.
Таблицы и связи создавались не с помощью запросов, а визуально в SQL Server Manager. Что именно интересует в связях?

Цитата:
Не понятно вообще зачем таблица PARTAKERS - единственное её информационное поле можно просто поместить в таблицу MY_PROJECT
После нормализации таблиц пришлось вынести поле в отдельную таблицу.
Цитата:
Не факт. Может на нем и есть ошибка.
Трассировал и с cancel и без cancel. Все одно и тоже. Думаю, что все таки буду использовать обычный StringGrid и хранимые процедуры для редактирования, фильтрации и отображения инфы. Думаю, отлавливать ошибку с невыделенной памятью в dll будет намного сложней.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 25.03.2014 в 01:18.
Rin вне форума Ответить с цитированием
Старый 25.03.2014, 02:26   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

в ошибке указан ее адрес
eval вне форума Ответить с цитированием
Старый 25.03.2014, 08:48   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Удивительно много накручено для добавления данных в простенькую таблицу.
Потом удивляемся ошибкам.

К чему, например, выкрутасы с обновлением в процедуре save_changes.
Когда достаточно просто переоткрыть датасет (для этого в АДО датасетах есть метод Requery или просто Close/Open; кстати, Refresh здесь бесполезен).
Если это не учебная задача, то вообще непонятно зачем нужна ХП для добавления данных.
Да и недоумение Аватар'а разделяю. Не нужна эта доп. таблица. Если посмотреть на запросы в ХП, то видно, что это плод не нормализации, а непонятно чего, т.к. связь этих таблиц один-к-одному.
Будьте проще в коде и обезопасите себя от многих ошибок.

Я бы этот код переписал с применением ADOQuery с запросом INSERT. Большего и не надо.
Прик вне форума Ответить с цитированием
Старый 25.03.2014, 10:09   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
зачем нужна ХП для добавления данных.
а зачем они вообще нужны?
eval вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
добавление записи через adoquery kolyan2288 БД в Delphi 2 07.01.2013 22:18
Добавление записи в таблицу через AdoQuery natt23 БД в Delphi 2 30.10.2012 12:21
Добавление записи через форму Studbgc Microsoft Office Access 1 27.04.2012 15:36
Добавление записи через FIBDataSet Lokos БД в Delphi 13 04.05.2010 12:32
Добавление записи через TQuery [ошибка] DimOn4Ik БД в Delphi 10 10.04.2010 20:36