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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2009, 19:54   #1
Morgana
Новичок
Джуниор
 
Регистрация: 11.08.2009
Сообщений: 7
По умолчанию процедура Insert

Здравствуйте, вы не подскажете, что я делаю не так.
База данных, состоящая из одной таблицы, написана в SQL 2005, там же создана процедура:

CREATE PROC InsertPasport
@s_n INT
,@surname VARCHAR(30)
,@name1 VARCHAR(30)
,@name2 VARCHAR(30)
,@birthday DATETIME
,@who_v VARCHAR(500)
,@when_v DATETIME
,@registration VARCHAR(500)
,@adres VARCHAR(500)
,@family VARCHAR(20)
AS
Begin
INSERT INTO Pasport
(S_N, SURNAME, NAME1, NAME2, BIRTHDAY, WHO_V,
WHEN_V, REGISTRATION, ADRES, FAMILY)
VALUES (@s_n, @surname, @name1, @name2, @birthday, @who_v,
@when_v, @registration, @adres, @family)
end
GO

Интерфейс к базе создаётся на Delphi. Проблема в том что при обращении к процедуре “InsertPasport” :

procedure TForm2.FormCreate(Sender: TObject);
begin
ADOQuery1.close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('EXEC InsertPasport');
ADOQuery1.Open;
ADOQuery1.Active:=true;
end;

Появляется ощибка: Exception class EOleException with message 'Procedure or Function 'InsertPasport' expects parameter '@s_n', which was not supplied'.
Morgana вне форума Ответить с цитированием
Старый 11.08.2009, 21:08   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

А параметры кто будет в процедуру передавать?
А то получается требуете добавить паспорт, а какой, чей и с какой целью не указываете.
pu4koff вне форума Ответить с цитированием
Старый 12.08.2009, 01:00   #3
Morgana
Новичок
Джуниор
 
Регистрация: 11.08.2009
Сообщений: 7
По умолчанию

А вас не затруднит привести пример.
Morgana вне форума Ответить с цитированием
Старый 12.08.2009, 08:10   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Ну вообще для работы с хранимыми процедурами есть ADOStoredProc. В ADOQuery вроде бы надо как-то так:
Код:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('EXEC InsertPasport :s_n, :surname, ...');
ADOQuery1.Parameters[0] := 10; // s_n := 10
ADOQuery1.Parameters.ParamByName('surname').AsString := 'трям'; // surname = трям
...
ADOQuery1.Exec; // Open тут не нужен, потому что процедура не возвращает никаких данных
При использовании ADOStoredProc как-то так:
Код:
ADOStoredProc1.ProcedureName := 'InsertPasport';
ADOStoredProc1.Parameters[0] := 10;
...
ADOStoredProc1.Exec;
В общем как-то так, но могу ошибаться, т.к. писал по памяти
pu4koff вне форума Ответить с цитированием
Старый 12.08.2009, 08:13   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А вас не затруднит привести пример.
Давно не работал с параметрами, но предположим так:
Код:
ADOQuery1.SQL.Add('EXEC InsertPasport(1,"John","Smith", ну и тут остальные параметры)');
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.08.2009, 13:49   #6
Morgana
Новичок
Джуниор
 
Регистрация: 11.08.2009
Сообщений: 7
По умолчанию

Код:
Form1.ADOQuery1.close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.add('EXEC InsertPasport :s_n, :surname, :name1, :name2, :birthday, :who_v, :when_v, :registration, :adres, :family');
ADOQuery1.Parameters[0].Value:=10;
ADOQuery1.Parameters.ParamByName('surname').Value:= DBEdit1.Text;
ADOQuery1.Parameters.ParamByName('name1').Value:= DBEdit2.Text;
ADOQuery1.Parameters.ParamByName('name2').Value:= DBEdit3.Text;
ADOQuery1.Parameters.ParamByName('birthday').Value:= DBEdit4.Text;
ADOQuery1.Parameters.ParamByName('who_v').Value:= DBMemo1.Text;
ADOQuery1.Parameters.ParamByName('when_v').Value:= DBEdit6.Text;
ADOQuery1.Parameters.ParamByName('registration').Value:= DBMemo2.Text;
ADOQuery1.Parameters.ParamByName('adres').Value:= DBMemo3.Text;
ADOQuery1.Parameters.ParamByName('family').Value:= DBEdit7.Text;
ADOQuery1.ExecSQL;
возникает сообщение :
Exception class EDatabaseError with message 'ADOQuery1: CommandText does not return a result set'.
Как это можно исправить?
Morgana вне форума Ответить с цитированием
Старый 12.08.2009, 14:00   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

может так?
Код:
ADOQuery1.SQL.add('EXEC InsertPasport( :s_n, :surname, :name1, :name2, :birthday, :who_v, :when_v, :registration, :adres, :family)');
soleil@mmc вне форума Ответить с цитированием
Старый 12.08.2009, 15:05   #8
Morgana
Новичок
Джуниор
 
Регистрация: 11.08.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
может так?
Код:
ADOQuery1.SQL.add('EXEC InsertPasport( :s_n, :surname, :name1, :name2, :birthday, :who_v, :when_v, :registration, :adres, :family)');
попробовала выдаёт ошибку: Exception class EOleException with message 'Incorrect syntax near '@P1''
Morgana вне форума Ответить с цитированием
Старый 12.08.2009, 15:49   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Morgana Посмотреть сообщение
возникает сообщение :
Exception class EDatabaseError with message 'ADOQuery1: CommandText does not return a result set'.
Как это можно исправить?
А процедура вызывается? запись в базе появляется?
Вообще это он ругается, что ничего не возвращается (оно и правильно. процедура ваша же ничего не возвращает), только вот это логично при Open, а при ExecSQL вроде ничего и не ожидается...
Попробуйте еще у свойства ExecuteOptions вашего ADOQuery1 установить eoExecuteNoRecords в true.
pu4koff вне форума Ответить с цитированием
Старый 12.08.2009, 16:12   #10
Morgana
Новичок
Джуниор
 
Регистрация: 11.08.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
А процедура вызывается? запись в базе появляется?
Вообще это он ругается, что ничего не возвращается (оно и правильно. процедура ваша же ничего не возвращает), только вот это логично при Open, а при ExecSQL вроде ничего и не ожидается...
Попробуйте еще у свойства ExecuteOptions вашего ADOQuery1 установить eoExecuteNoRecords в true.
Да записи в таблице появляются, но при этом по 2, с разными значениями поля S_N. Если eoExecuteNoRecords ->true то появляется такое сообщение: " 'Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом'.
Morgana вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Insert - ? Evgenii БД в Delphi 2 06.07.2009 02:24
Процедура в процедура в C++ Builder Ecosasha C++ Builder 2 06.06.2009 17:17
переменная внутри Insert hinku БД в Delphi 1 15.04.2009 17:21
insert и update Tanusha SQL, базы данных 4 13.03.2009 14:47
mysql проблемы с INSERT proglamer PHP 4 30.03.2008 14:36