|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
Здравствуйте все! У меня база под MS SQl server 7.0. Пишу на Delphi'ях программулину, используя BDE (руководство почему-то не любит ADO). Вопрос следующий: Действительно ли нельзя вызвать stor. proc. с параметрами из Delphi, используя BDE. Точнее, вызвать то можно, если указать все до одного параметра. А если хоть один опустить -прут exception'ны. Хотя с ADO все работает. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2001, 07:21 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
Действительно, вызывать stored proc надо бережно. Встречный вопрос: Если есть процедура, для неё указан список параметров, то какой смысл не указывать эти параметры? Или ты имеешь ввиду параметры по умолчанию? А ваще, я компонент TStoredProc не люблю. И советую всем пользоваться TQuery. Просто пишешь запрос типа "Exec SomeProc par1, par2,...". И выполняешь его либо TQuery.ExecSQL, если процедура не возвращает данные, либо TQuery.Open, если возвращает. Удачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2001, 07:48 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
2 Commander Не все так просто. Объясняю подробнее. Есть процедура, у которой, например, 15 параметров. Она сохраняет в базе документ, проверяет всякие там условия и т.д. В некоторых случаях нужно указывать не все, а, допустим, 5. Причем такая возможность есть. Просто пишем "Exec proc_name @par1=значение, ..., @par5=значение", а остальные не указываем. Тогда она по умолчанию сует в базу NULL. Использую ADO, (именно компонент StorProc, с ADOQuery не проходит), все работает как надо. Если использовать BDE, то не StorProc, не ТQuery не работает. Она цепляет параметры, а дальше пишет, что проц. не найдена. Вообще, я где-то слышал, что это у BDE такой глюк. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2001, 08:11 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
Хм.. Странно.. А в самой процедуре прописаны значения параметров по умолчанию? Я не работал с процедурами, имеющими 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, там и посмотрим что к чему. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2001, 09:08 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
Процедуры не важно какие. Вот пример. 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, и никакой ошибки быть не может. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2001, 13:00 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
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) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2001, 09:55 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
Разрешите вмешаться. Я вообще-то давно с АДО работаю, но помню в БДЕшке был у меня подобный глюк, когда перешел на SQL 7.0 Вроде поборол я его следующим образом- StoredProc1(or Query1).ParamCheck:=true, и самое главное: CREATE Proc1;1 (@par1 int=1,@par2 char(3)='XXX',....) AS ...... обратите внимание на ";1" ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2001, 09:35 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
Все очень просто: Перед вызовом процедуры через 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; Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2001, 18:32 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
Зря вы не любите TStoredProc. И в рантайм легко создавать, и парметры указывать, если не знаете как то посмотрите хелп вся написана, могу и я свой код показать. Уважаемый Commander сказал что он использует TQuery вместо TStoredProc, но не вовсех слуаях он может помочь, простой пример: Хранимаю процеудра должна вернуть курсор, и ещё OUTPUT параметры. Например я сделал свой наследник от TStoredProc, сейчас объясню почему, у нас в конторе принят следующий стандарт т.е. любая хранимая должна возращать результат выполнения если он не равен нулю значит произошла ошибка, текст ошибки должен возвращать OUTPUT параметр @err_mess. И мой компонент смотрит результат выполнения если он не равен нулю, то генерится ексепшен с тектом ошибки из параметра @err_mess. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2001, 14:12 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
2Tarantino Согласен с Вами, output параметр мне до сих пор не нужен был, а с этой позиции TStoredProc удобней TQuery. (Хотя надо посмотреть, может быть как-то можно научить TQuery получать output.) >>И в рантайм легко создавать, и парметры указывать, если не знаете как то посмотрите хелп вся >>написана, могу и я свой код показать. Я бы хотел посмотреть Ваш код, где в рантайм задаются по крайней мере следующие параметры TStoredProc: DatabaseName, StoredProcName, Params. Дело в том, что проблемы у меня начинаются только если создаёшь псевдоним базы данных(alias) в рантайм (то есть на этапе разработки не известна база данных и подключение полностью происходит в рантайм) и нет возможномти задать DatabaseName и StoredProcName на этапе разработки. А тогда начинают глючить Params Если всё задавать на этапе разработки, то абсолютно никаких проблемм (хелп я читать умею, между прочим). Если Вы мне покажете безглючный код, удовлетворяющий моим условиям, то я буду Вам благодарен, признаю, что я ламер и перейду на TStoredProc. На самом деле, я давно хочу, чтобы мне объяснили как заставить работать TStoredProc полностью в рантайм. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2001, 08:59 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
\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 ... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2001, 06:52 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
У меня примерно такой же код как и у SergDanceHits. 2Commander, я псевдонинами никогда не пользуюсь, т.е. у меня есть компонент TDatabase указываю DriverName и DatabaseName, имя сервера и БД указываю через Params. А для всех датасетов указываю DatabaseName. Кстати получит через TQuery output параметры оченб легко, но одновременно с курсором это сделать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2001, 08:04 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
чтобы получить 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 читайте хелп! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2001, 17:16 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
чтобы получить 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 читайте хелп! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2001, 17:18 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
Сам хелп читай: 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2001, 06:05 |
|
BDE+MS SQL Server=глюк?
|
|||
---|---|---|---|
#18+
2Lexx: По мимо всега прочего никого нет проблем с получением OUTPUT параметров хранимой процедуры из TStoredProc, так же достаточно легко получить из TQuery. Проблема в другом попробуй вызвать хранимую процедуру которая возвращвает курсор и OUTPUT параметры из TQuery, и у тябя одновременно получить и то и то не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2001, 06:13 |
|
|
start [/forum/topic.php?fid=58&fpage=2090&tid=2120163]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 247ms |
total: | 383ms |
0 / 0 |