Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / BDE+MS SQL Server=глюк? / 16 сообщений из 16, страница 1 из 1
06.06.2001, 07:21
    #32007016
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
Здравствуйте все!
У меня база под MS SQl server 7.0. Пишу на Delphi'ях программулину, используя BDE (руководство почему-то не любит ADO). Вопрос следующий:
Действительно ли нельзя вызвать stor. proc. с параметрами из Delphi, используя BDE. Точнее, вызвать то можно, если указать все до одного параметра. А если хоть один опустить -прут exception'ны. Хотя с ADO все работает. Заранее спасибо.
...
Рейтинг: 0 / 0
06.06.2001, 07:48
    #32007023
Commander
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
Действительно, вызывать stored proc надо бережно.
Встречный вопрос:
Если есть процедура, для неё указан список параметров, то какой смысл не указывать эти параметры?
Или ты имеешь ввиду параметры по умолчанию?
А ваще, я компонент TStoredProc не люблю. И советую всем пользоваться TQuery. Просто пишешь запрос типа "Exec SomeProc par1, par2,...". И выполняешь его либо TQuery.ExecSQL, если процедура не возвращает данные, либо TQuery.Open, если возвращает. Удачи.
...
Рейтинг: 0 / 0
06.06.2001, 08:11
    #32007030
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
2 Commander
Не все так просто. Объясняю подробнее.
Есть процедура, у которой, например, 15 параметров. Она сохраняет в базе документ, проверяет всякие там условия и т.д. В некоторых случаях нужно указывать не все, а, допустим, 5. Причем такая возможность есть.
Просто пишем "Exec proc_name @par1=значение, ..., @par5=значение", а остальные не указываем. Тогда она по умолчанию сует в базу NULL. Использую ADO, (именно компонент StorProc, с ADOQuery не проходит), все работает как надо. Если использовать BDE, то не StorProc, не ТQuery не работает. Она цепляет параметры, а дальше пишет, что проц. не найдена. Вообще, я где-то слышал, что это у BDE такой глюк.
...
Рейтинг: 0 / 0
08.06.2001, 09:08
    #32007219
Commander
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
Хм.. Странно..
А в самой процедуре прописаны значения параметров по умолчанию?
Я не работал с процедурами, имеющими 30 параметров, но для,к примеру, 3-х у меня реально работает что-то типа этого:

1. Собственно, процедура
CREATE PROCEDURE Graph_select
@id int,
@iduz varchar(4),
@gor smallint = 0 /*умалчиваемый параметр*/
AS
Begin
Set Nocount On
...
/*тело процедуры*/
...
End

2. Собственно, вызов
Query1.SQL.Clear;
Query1.SQL.ADD('EXEC Graph_select 1, 217');
{тоже самое, что и Query1.SQL.ADD('EXEC Graph_select 1, 217, 0'); - работает одинаково хорошо}
try
Query1.ExecSQL;
Database1.Commit;
except
Data.Database1.Rollback;
raise
end;

Ессно, (TQuery)Query1 должна быть грамотно подключена к (TDatabase)Database1, а та в свою очередь, к базе данных.
А параметры по умолчанию не забываешь помещать в конце объявления, а то фигня получиться при вызове.

Если хочешь, вышли мне на alex_keeper@mail.ru текст трабловой процедуры, я её впендюрю к себе на сервер и попробую вызвать через BDE, там и посмотрим что к чему.
...
Рейтинг: 0 / 0
08.06.2001, 13:00
    #32007241
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
Процедуры не важно какие. Вот пример.

procedure sp_test (@par1 int, @par2 int)
as
declare @sum int
select @sum=@par1+@par2

// Сразу оговорюсь, что все нижеприведенное работает в ADO.

Допустим, усё.
Теперь в Delphi (BDE)
TStorProc: sp1
sp1.parambyname('@par1').valuе:=5;
sp1.parambyname('@par2').value:=10;
sp1.execproc; // все работает нормально

Если же:
sp1.parambyname().valuе:=5;
sp1.execproc; // ошибка, хотя, повторюсь, в ADO без проблем

А TQuery типа "Exec sp_test @par1=5" аналогичный глюк.
А ведь процедуры должны работать, если им передаются не все параметры.
Она сама по умолчанию считает, что если нет значение - то NULL, и никакой ошибки быть не может.
...
Рейтинг: 0 / 0
09.06.2001, 09:55
    #32007270
Commander
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
1. Query
Может у нас настройки разные? Попробовал я выполнить твою sp_test с помощью ADOQuery, не указывая второй параметр - получил EOleExeption 'procedure sp_test expects parameter @par2 wich was not supplied'.
Абсолютно то же самое с BDE (только ексепшн EDBEEngineError :0)).
2. TADOStoredProc
Действительно, в Profilere видно, что вместо опущенного параметра подставляется NULL и всё как бы работает.
3. TStoredProc
Результата, аналогичного пункту 2, я у себя добился лишь следующими манипуляциями: поместил на форму TStoredProc, подключил к базе и к процедуре sp_test (выбрал из списка "dbo.sp_test;1" и ручками стёр ";1"), вызвал окно редактирования параметров, проставил всем параметрам ParamType:=ptInput. И вуаля! Достаточно задать один параметр, вместо второго подставляется NULL. Но это сколько же надо тахаться!! За ето не люблю я TStoredProc. Может он только у меня такой глючный, что без окна редактирования параметров на этапе разработки, а просто в коде в runtime нельзя параметры задать без трахатни?? Обидно.
4. Так тебе на самом деле что нужно? Написать прогу или убедиться, что BDE - отстой?
Если первое, то внемли советам и обойди эту пролемму. Например, путём прописывания в объявлении процедуры значений параметров по умолчанию (типа CREATE PROCEDURE sp_test(@par1 int, @par2 int=0)...) - гарантирую, что ругани не будет.
Если второе, то можем подискутировать... ;0)
...
Рейтинг: 0 / 0
11.06.2001, 09:35
    #32007307
AnKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
Разрешите вмешаться. Я вообще-то давно с АДО работаю, но помню в БДЕшке был у меня подобный глюк, когда перешел на SQL 7.0 Вроде поборол я его следующим образом-
StoredProc1(or Query1).ParamCheck:=true, и самое главное:

CREATE Proc1;1 (@par1 int=1,@par2 char(3)='XXX',....)
AS
......


обратите внимание на ";1"
...
Рейтинг: 0 / 0
15.06.2001, 18:32
    #32007631
AL_R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
Все очень просто:
Перед вызовом процедуры через BDE, все параметры, за исключением тех, у которых есть значение по умолчанию, должны быть ОБЯЗАТЕЛЬНО проинициализированы. Если параметров много, то можно поступить, например так:

with TStoredProc do
_begin
__with Params do
___for i := 0 to ParamCount - 1 do
____Param .Clear; //Установить параметр в NULL
___ParamByName('@SomeParam1').Value := SomeValue1;
___ParamByName('@SomeParam2').Value := SomeValue2;
___ExecProc;
_end;

Удачи!
...
Рейтинг: 0 / 0
13.07.2001, 14:12
    #32009579
Tarantino
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
Зря вы не любите TStoredProc.
И в рантайм легко создавать, и парметры указывать, если не знаете как то посмотрите хелп вся написана, могу и я свой код показать.
Уважаемый Commander сказал что он использует TQuery вместо TStoredProc, но не вовсех слуаях он может помочь, простой пример: Хранимаю процеудра должна вернуть курсор, и ещё OUTPUT параметры.
Например я сделал свой наследник от TStoredProc, сейчас объясню почему, у нас в конторе принят следующий стандарт т.е. любая хранимая должна возращать результат выполнения если он не равен нулю значит произошла ошибка, текст ошибки должен возвращать OUTPUT параметр @err_mess. И мой компонент смотрит результат выполнения если он не равен нулю, то генерится ексепшен с тектом ошибки из параметра @err_mess.
...
Рейтинг: 0 / 0
15.07.2001, 08:59
    #32009618
Commander
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
2Tarantino
Согласен с Вами, output параметр мне до сих пор не нужен был, а с этой позиции TStoredProc удобней TQuery. (Хотя надо посмотреть, может быть как-то можно научить TQuery получать output.)

>>И в рантайм легко создавать, и парметры указывать, если не знаете как то посмотрите хелп вся
>>написана, могу и я свой код показать.
Я бы хотел посмотреть Ваш код, где в рантайм задаются по крайней мере следующие параметры TStoredProc: DatabaseName, StoredProcName, Params. Дело в том, что проблемы у меня начинаются только если создаёшь псевдоним базы данных(alias) в рантайм (то есть на этапе разработки не известна база данных и подключение полностью происходит в рантайм) и нет возможномти задать DatabaseName и StoredProcName на этапе разработки. А тогда начинают глючить Params Если всё задавать на этапе разработки, то абсолютно никаких проблемм (хелп я читать умею, между прочим). Если Вы мне покажете безглючный код, удовлетворяющий моим условиям, то я буду Вам благодарен, признаю, что я ламер и перейду на TStoredProc. На самом деле, я давно хочу, чтобы мне объяснили как заставить работать TStoredProc полностью в рантайм.
...
Рейтинг: 0 / 0
16.07.2001, 06:52
    #32009634
SergDanceHits
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
\nprocedure SomeProcedure(adoConnection: TADOConnection;
MasOfParamName: array of string;
MasOfParamValue: array of Variant;
var i,j: integer;
ParamType: TParameterDirection;
ftType: TFieldType;

begin
stReports.Connection:= adoConnection;
stReports.ProcedureName:= 'st_temp';
stReports.Parameters.Clear;
case ... // тут выбор типа параметра, короче, присвоение ftType
4,5,-6: ftType:= ftInteger;
3,2: ftType:= ftBCD;
11: ftType:= ftDateTime;
12,1,-1: ftType:= ftString;
else
ftType:= ftString;
end;
case ... // а тут выбираю ParamType
1: ParamType:= pdInput;
2: ParamType:= pdInputOutput;
else
ParamType:= pdInput;
end;

for i:= low(MasOfParamName) to high(MasOfParamName) do
if VarToStr(parValue) <> '' then
stReports.Parameters.CreateParameter(parName, ftType, ParamType,
qStColumns.FieldByName('LENGTH').asInteger, ParValue)
else
stReports.Parameters.CreateParameter(parName, ftType, ParamType,
qStColumns.FieldByName('LENGTH').asInteger, null);


полный real-time. Все прекрасно работает и никаких глюков! Пользуюсь продолжительное время, косяков не наблюдал.
Ключевые моменты здесь -
1. stReports.Parameters.Clear
2. stReports.Parameters.CreateParameter(...)

ЗЫ это на ADO. От BDE отказался и не жалею.
ЗЗЫ А по поводу параметров в Stored Procedure - если они могут отсутствовать, им полюбому надо дефолтовое значение!
\nCREATE PROCEDURE SomeProcedure
@prm1 int = null, //может принимать значение null
@prm2 int, //обязательно наличие значения
...
AS
...
...
Рейтинг: 0 / 0
17.07.2001, 08:04
    #32009706
Tarantino
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
У меня примерно такой же код как и у SergDanceHits.
2Commander, я псевдонинами никогда не пользуюсь, т.е. у меня есть компонент TDatabase указываю DriverName и DatabaseName, имя сервера и БД указываю через Params. А для всех датасетов указываю DatabaseName.
Кстати получит через TQuery output параметры оченб легко, но одновременно с курсором это сделать нельзя.
...
Рейтинг: 0 / 0
18.07.2001, 17:16
    #32009873
Lexx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
чтобы получить output параметры в storedProc надо после выполнения вызвать storedProc.getResults:
пример из хелпа дельфы:

StoredProc1.Open;
while not StoredProc1.EOF do
begin
StoredProc1.Next;
{Do Something}
end;
StoredProc1.GetResults;
Edit1.Text := StoredProc1.ParamByName('Output');


PS читайте хелп!
...
Рейтинг: 0 / 0
18.07.2001, 17:18
    #32009874
Lexx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
чтобы получить output параметры в storedProc надо после выполнения вызвать storedProc.getResults:
пример из хелпа дельфы:

StoredProc1.Open;
while not StoredProc1.EOF do
begin
StoredProc1.Next;
{Do Something}
end;
StoredProc1.GetResults;
Edit1.Text := StoredProc1.ParamByName('Output');


PS читайте хелп!
...
Рейтинг: 0 / 0
19.07.2001, 06:05
    #32009896
Alex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
Сам хелп читай:

Call GetResults to force a Sybase (!!!!!) stored procedure to return its result set, if any, to the client. For stored procedures on all other servers, result sets are automatically flushed to the client (!!!!!), but Sybase stored procedures do not return a result set until the cursor is positioned at the end of the set.
...
Рейтинг: 0 / 0
19.07.2001, 06:13
    #32009898
Tarantino
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE+MS SQL Server=глюк?
2Lexx:
По мимо всега прочего никого нет проблем с получением OUTPUT параметров хранимой процедуры из TStoredProc, так же достаточно легко получить из TQuery.
Проблема в другом попробуй вызвать хранимую процедуру которая возвращвает курсор и OUTPUT параметры из TQuery, и у тябя одновременно получить и то и то не получится.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / BDE+MS SQL Server=глюк? / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]