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

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
BDE+MS SQL Server=глюк?
    #32007270
Commander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
BDE+MS SQL Server=глюк?
    #32007307
AnKa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разрешите вмешаться. Я вообще-то давно с АДО работаю, но помню в БДЕшке был у меня подобный глюк, когда перешел на SQL 7.0 Вроде поборол я его следующим образом-
StoredProc1(or Query1).ParamCheck:=true, и самое главное:

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


обратите внимание на ";1"
...
Рейтинг: 0 / 0
BDE+MS SQL Server=глюк?
    #32007631
AL_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все очень просто:
Перед вызовом процедуры через 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
BDE+MS SQL Server=глюк?
    #32009579
Tarantino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зря вы не любите TStoredProc.
И в рантайм легко создавать, и парметры указывать, если не знаете как то посмотрите хелп вся написана, могу и я свой код показать.
Уважаемый Commander сказал что он использует TQuery вместо TStoredProc, но не вовсех слуаях он может помочь, простой пример: Хранимаю процеудра должна вернуть курсор, и ещё OUTPUT параметры.
Например я сделал свой наследник от TStoredProc, сейчас объясню почему, у нас в конторе принят следующий стандарт т.е. любая хранимая должна возращать результат выполнения если он не равен нулю значит произошла ошибка, текст ошибки должен возвращать OUTPUT параметр @err_mess. И мой компонент смотрит результат выполнения если он не равен нулю, то генерится ексепшен с тектом ошибки из параметра @err_mess.
...
Рейтинг: 0 / 0
BDE+MS SQL Server=глюк?
    #32009618
Commander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Tarantino
Согласен с Вами, output параметр мне до сих пор не нужен был, а с этой позиции TStoredProc удобней TQuery. (Хотя надо посмотреть, может быть как-то можно научить TQuery получать output.)

>>И в рантайм легко создавать, и парметры указывать, если не знаете как то посмотрите хелп вся
>>написана, могу и я свой код показать.
Я бы хотел посмотреть Ваш код, где в рантайм задаются по крайней мере следующие параметры TStoredProc: DatabaseName, StoredProcName, Params. Дело в том, что проблемы у меня начинаются только если создаёшь псевдоним базы данных(alias) в рантайм (то есть на этапе разработки не известна база данных и подключение полностью происходит в рантайм) и нет возможномти задать DatabaseName и StoredProcName на этапе разработки. А тогда начинают глючить Params Если всё задавать на этапе разработки, то абсолютно никаких проблемм (хелп я читать умею, между прочим). Если Вы мне покажете безглючный код, удовлетворяющий моим условиям, то я буду Вам благодарен, признаю, что я ламер и перейду на TStoredProc. На самом деле, я давно хочу, чтобы мне объяснили как заставить работать TStoredProc полностью в рантайм.
...
Рейтинг: 0 / 0
BDE+MS SQL Server=глюк?
    #32009634
SergDanceHits
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\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
BDE+MS SQL Server=глюк?
    #32009706
Tarantino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня примерно такой же код как и у SergDanceHits.
2Commander, я псевдонинами никогда не пользуюсь, т.е. у меня есть компонент TDatabase указываю DriverName и DatabaseName, имя сервера и БД указываю через Params. А для всех датасетов указываю DatabaseName.
Кстати получит через TQuery output параметры оченб легко, но одновременно с курсором это сделать нельзя.
...
Рейтинг: 0 / 0
BDE+MS SQL Server=глюк?
    #32009873
Lexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чтобы получить 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
BDE+MS SQL Server=глюк?
    #32009874
Lexx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чтобы получить 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
BDE+MS SQL Server=глюк?
    #32009896
Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам хелп читай:

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
BDE+MS SQL Server=глюк?
    #32009898
Tarantino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Lexx:
По мимо всега прочего никого нет проблем с получением OUTPUT параметров хранимой процедуры из TStoredProc, так же достаточно легко получить из TQuery.
Проблема в другом попробуй вызвать хранимую процедуру которая возвращвает курсор и OUTPUT параметры из TQuery, и у тябя одновременно получить и то и то не получится.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / BDE+MS SQL Server=глюк?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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