Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
Доброго времени суток, работники клавиатуры! Есть программа для работы с БД. Для доступа к БД используется dbExpress, чтобы обеспечить работу с любой БД SQL. Сегодня при запуске непонятная ситуация:
  Result  := -1;
  FProc.StoredProcName      := 'GET_USER_ID';
  FProc.ParamByName('u_name').AsString  := AName;
  FProc.ExecProc;
  Result  := FProc.ParamByName('u_id').AsInteger;
Запускаю программу и при попытке установить параметры хранимой процедуры получаю ошибку "Parameter "u_name" not found."(как-то так, емнип). Данный код работал в течение 2-3 месяцев без ошибок. У меня Delphi 10.2, если это важно. Компонент создается динамически.
22 апр 19, 18:25    [21869177]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
Gator
Member

Откуда: Москва
Сообщений: 14350
my_nik_name_is,

Не знаю, что у тебя зв процедура, кто ёё создавал и какая у тебя версия сервера.
У меня такой процедуры нет
+ у меня есть вот такое
Value Name
Microsoft SQL Server 2017 (RTM-CU14) (KB4484710) - 14.0.3076.1 (X64) Mar 12 2019 19:29:19 Copyright (C) 2017 Microsoft Corporation Developer Edition (64-bit) on Windows 10 Pro for Workstations 10.0 <X64> (Build 17763: ) @@VERSION
14 MICROSOFTVERSION
259 SUSER_ID
gator''s eater .SUSER_NAME
1 USER_ID
dbo CURRENT_.USER
22 апр 19, 20:54    [21869266]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
Gator,

Спасибо, друг. У меня firebird 3.0. Процедуру создал я. Какие ещё данные тебе предоставить?
22 апр 19, 21:28    [21869277]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28014
my_nik_name_is,

FProc - что за компонент-то?

Вообще, обычно, если что-то работало, а потом вдруг сломалось, то надо проверять, что изменилось перед тем как "вдруг сломалось".

Если компонент создается в рантайме, видимо, почему-то не грузятся метаданные о параметрах процедуры. Либо их загрузка выключена, либо что-то поломалось.

На всякий случай:
http://docwiki.embarcadero.com/RADStudio/Rio/en/Working_with_Stored_Procedure_Parameters
22 апр 19, 23:44    [21869338]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4500
my_nik_name_is,

Такое бывает.
Попробуйте:
1) очистить параметры
2) обратиться к ним не по имени, а по индексу
23 апр 19, 00:45    [21869354]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
kdv,

FProc - TSQLStoredProc
23 апр 19, 07:25    [21869402]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
Сейчас откатился на более раннюю версию проекта, чтобы убрать изменения, сделанные за неделю, все равно не работает.
23 апр 19, 08:43    [21869440]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
kdv
my_nik_name_is,
http://docwiki.embarcadero.com/RADStudio/Rio/en/Working_with_Stored_Procedure_Parameters

Это я уже читал, но все равно спасибо.
23 апр 19, 08:44    [21869441]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
goldmi45
Member

Откуда:
Сообщений: 1162
my_nik_name_is
Сейчас откатился на более раннюю версию проекта, чтобы убрать изменения, сделанные за неделю, все равно не работает.

А в базе есть такие параметры у процедуры? М.б. что-то изменилось в самой базе?
23 апр 19, 09:14    [21869472]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4500
my_nik_name_is,

+ В АДО аналогичная проблема решалась приблизительно так, как я написал для SQLStoredProc1

SQLStoredProc1.]ParamCheck:=True;
  ...
SQLStoredProc1.StoredProcName      := 'GET_USER_ID';

SQLStoredProc1.Refresh;
//SQLStoredProc1.PrepareStatement;  --принудительная подготовка, В АДО достаточно Refresh
SQLStoredProc1.Params[0].Value:=AName;

...
23 апр 19, 09:27    [21869486]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 983
prepare?
23 апр 19, 09:49    [21869510]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
энди,

True

пробовал сбрасывать, а потом ставить флаг, не помогает.
23 апр 19, 09:56    [21869515]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
ёёёёё
Member

Откуда:
Сообщений: 404
my_nik_name_is,

ну давай я,что ли, попрошу у тебя текст процедуры.
23 апр 19, 10:10    [21869531]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
Gerasimenko
my_nik_name_is,

+ В АДО аналогичная проблема решалась приблизительно так, как я написал для SQLStoredProc1

SQLStoredProc1.]ParamCheck:=True;
  ...
SQLStoredProc1.StoredProcName      := 'GET_USER_ID';

SQLStoredProc1.Refresh;
//SQLStoredProc1.PrepareStatement;  --принудительная подготовка, В АДО достаточно Refresh
SQLStoredProc1.Params[0].Value:=AName;

...

Попробовал. Cannot perform this operation on a closed dataset
23 апр 19, 11:46    [21869652]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
ёёёёё,
Лови
create or alter procedure GET_USER_ID (
U_NAME varchar(100))
returns (
U_ID integer)
as
begin
select u_id from user_names where nick = :u_name into :u_id;
if (u_id is null) then
u_id = -1;
suspend;
end
23 апр 19, 11:48    [21869656]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6212
my_nik_name_is,

Сделай через Query.

P.S. Я всегда использовал связку:
   Q.SQL.Text:='SELECT ';
   Q.Prepare;
   Q.ParamByName('YYY').AsXXX:=.....
   Q.Execute;
23 апр 19, 11:54    [21869666]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
Gerasimenko,

Ой, сори. Unable to determine field names for %s
23 апр 19, 11:54    [21869667]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6212
my_nik_name_is,

И в процедуре у себя пропиши или SELECT FIRST 1 .... или UNIQUE наложи - там потенциальная дырка может быть, если пользователей с одним именем несколько окажется.
23 апр 19, 11:56    [21869670]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28014
my_nik_name_is,

вообще-то suspend предполагает использование процедуры как слелективной, т.е. select * from proc, в этом случае нужно использовать компонент для селекта, а не TSQLStoredProc

http://www.ibase.ru/sp_call/
23 апр 19, 12:02    [21869676]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
kdv,

Имя пользователя всегда уникально. Двух одинаковых быть не может.
23 апр 19, 13:31    [21869778]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
В справке написано, что если процедура возвращает данные, надо использовать метод Active или Open
На практике оказалось, что ExecProc тоже прекрасно возвращает данные.
К тому же в примере по ссылке выше
+
Используется ExecProc для процедуры, возвращающей данные
var
  P1, P2: TParam;
begin
  ...
  with StoredProc1 do begin
    StoredProcName := 'GET_EMP_PROJ';
    Params.Clear;
    P1 := TParam.Create(Params, ptInput);
    P2 := TParam.Create(Params, ptOutput);
    try
      Params[0].Name := 'EMP_NO';
      Params[1].Name := 'PROJ_ID';
      ParamByname('EMP_NO').AsSmallInt := 52;
      ExecProc;
      Edit1.Text := ParamByname('PROJ_ID').AsString;
    finally
      P1.Free;
      P2.Free;
    end;
  end;
  ...
end;

Исходя из этого сделал вывод, что данные можно получать любым удобным способом. Хоть select, хоть exec. Но с exec меньше возни.
23 апр 19, 13:44    [21869792]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
my_nik_name_is
Member

Откуда:
Сообщений: 39
Часть проблемы решена.
Скомбинировал доступ к параметрам хранимой процедуры
+

  FProc.StoredProcName  := 'GET_USER_ID';
  FProc.Prepared        := True;
  FProc.Params[0].Value := AName;
  FProc.ExecProc;
  Result  := FProc.ParamByName('u_id').AsInteger;


Входные параметры задаю через индекс, а выходные получаю по имени параметра. Пока переписал самое важное, постепенно буду переводить на новые рельсы весь код. Спасибо всем за помощь!
23 апр 19, 16:22    [21869940]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6212
my_nik_name_is,

Проверь для интереса, что вернет Execute для процедуры, которая возвращает более одной строки данных.
23 апр 19, 16:50    [21869978]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4500
DarkMaster
my_nik_name_is,

Проверь для интереса, что вернет Execute для процедуры, которая возвращает более одной строки данных.

А что ты ожидаешь получить?
автор
TSQLStoredProc = class(TCustomSQLDataSet)
23 апр 19, 17:01    [21869987]     Ответить | Цитировать Сообщить модератору
 Re: TSQLStoredProc не видит параметры процедуры  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28014
my_nik_name_is
Хоть select, хоть exec. Но с exec меньше возни.

suspend в процедуре не имеет смысла, если процедура не предполагает возврат больше одной "строки", и соответствено, ее не планируют вызывать через select (для получения более одной строки).
23 апр 19, 23:33    [21870178]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить