StoredProc Issue

14 отговора 246 прегледа
#1

StoredProc Issue

Една TSQLStoredProc е с правилно зададени SQLConnection и StoredProcName характеристики и параметри. При извикване на ExecProc вдига изключение List index out of bounds (0) - (ни в клин, ни в ръкав) - защо ли?

-------------
Special killer double trouble triple extra nicotine monster!

Редактирано от z_free на

Отговор
в отговор на z_free #2

Re: StoredProc Issue

Не знам
Провери параметрите да не би да са зададени в дизайнтиме, а да са променени в базата. Дебъгвай в OnPrepare, може да видиш нещо

Отговор
в отговор на NDeu #3

Много странно

Много странно: ако и бъдат изтрити всички Params връща грешка от SQL servera, а ако има поне един параметър с каквото и да е име и произволна стойност вдига ЕListError изключението (list index out of bounds (0)). Ха.

-------------
Special killer double trouble triple extra nicotine monster!
Отговор
в отговор на z_free #4

Re: Много странно

Здравей!
Трябва да ти кажа че по нищо не личи грешката ти да идва от базата данни!
Такава грешка ти връща защото някъде в кода явно използваш tstrings или нещо производно пряко или като свойство на нещо на което не подаваш правилни параметри. Можеби връщаш резултата от заявката в такъв елемент и правилното изпълнение на заявката води до опит за обръщане към несъществуващ елемент от списъка! т.е. как се обработват данните след като се извлекът.
Чао!

Отговор
в отговор на z_free #5

Re: Много странно

Е-е-е
Дай повече инфо, ако искаш да ти се помогне конкретно де
Каква ти е базата?
Какви компоненти за достъп ползваш?
Какви са съобщенията за грешка?

Отговор
в отговор на NDeu #6

Ми аз щото мислех че е ясно....

Базата е MS SQL Server-ска, а компонентите за достъп са dbExpress.

Със сигурност не Violate-вам някой лист или масив. Ето sample:

if fMode = modAdd then begin

sspGetCgNo.ExecProc; // [1] тук викам процедурата.

-

sspGetCgNo е TSQLStoredProcedure. Ако закоментирам реда [1] няма грешка. Имам съмнения, че проблема може да е във вътрешната реализация на ExecProc; .......

Не знам, нещо друго освен име на процедурата, конекшън и параметри трябва ли да и задавам на тая сторедПроц?

-------------
Special killer double trouble triple extra nicotine monster!

Редактирано от z_free на

Отговор
в отговор на z_free #7

Re: Ми аз щото мислех че е ясно....

Не виждам нещо конкретно като проблем, затова само некои съображения
1. Ако това е процедура, която връща кърсър, трябва да я викаш с Open. В такъв случай бръмбъра може да се е скрил в някой от визуализиращите компоненти.
2. Ако тази процедура има входни параметри, не виждам къде ги установяваш.
3. При такъв случай аз бих изтрил всички дизайнтиме параметри, и в рънтиме бих дал Prepare и ако не даде грешка, да обходя списъка с параметрите


For i:=0 to Params.Count-1
do ShowMessage(Params[ i].Name...и т.н.);

И тука да търся какво съм оцапал
4. Ако ти дава грешка още на Prepare - търси грешката на сървъра


Айде със здраве, богати клиенти и по-малко бръмбъри

Отговор
в отговор на NDeu #8

Re: Ми аз щото мислех че е ясно....

Има и още нещо заради което се отказах от dbExpress - начина по който се работи с dll -та - и специално има доста проблеми с MS SQL - виж дали използваш последния update на библиотеката и последния SP за Делфи

---
Е т'ва е живот!

Редактирано от PhantomAS на

Отговор
в отговор на NDeu #9

Еми няма, това е отчайващо просто

Не искам да ви занимавам с толкова глупости, затова запоследно давам възможно най-подробно.

Това е процедура на сървъра, която има за цел да генерира уникален номер за PrimaryKey поле по определени правила. Взима като параметри име на таблица, име на поле (в зависимост от стойностите му генерира резултат) и две отграничаващи стойности за уникалния номер (min, max), като връща стойност в променлива с име result. Процедурата работи коректно - ползва се без проблем от MS Access приложение. Не връща курсор, а една единствена integer стойност.

Опитвам се да я викна със TSQLStoredProc. Задавам входните параметрите в дизайнтайм. Няма грешка при PrepareStatement (или Prepared := True). Всичко изглежда добре, просто при ExecSql метода вдига странното EListError изключение. Създавам входните параметри в RunTime (за тест) и пак получавам същата грешка. Странно е необяснимо.

Мога ли по-алтернативен начин да извикам тази процедура (не със TSQLStoredProc) и да видя стойността резултата и?

Хайде, отивам да се хвърлям през терасата

-------------
Special killer double trouble triple extra nicotine monster!
Отговор
в отговор на PhantomAS #10

Re: Възможно е и тук да е проблема

От къде точно мога да проверя това и да си сваля по-нова версия?

-------------
Special killer double trouble triple extra nicotine monster!
Отговор
в отговор на z_free #11

Re: Еми няма, това е отчайващо просто

алтернативно - през "Qury Analyzer" tool-а, EXEC ProcName Param1, Param2,...,ParamN

иначе колегите навремето се бориха точно с такова нещо, stored процедура за MS SQL през Dеlphi/ADOStoredProcedure. и решението се оказа преминаване от ADO 2.5 към ADO 2.6SP1. незнам дали и при теб не е това проблема...
новите версии на ADO-то са на сайта на MS, там има и програмче което проверява коя версия имаш инсталирана.

--------------------------------------
Започва Път от моят праг...
Отговор
в отговор на z_free #12

Re: Възможно е и тук да е проблема

Кажи коя версия използваш - т.е. версията на DLL, след това на Делфи и кой е последния SP който си слагал - и кога- другото ще проверя аз.

---
Е т'ва е живот!
Отговор
в отговор на Hateras #13

Абе човека не ползва ADO ами dbExpress

До z_free - не се хвърляй от терасата ;-)))) - довечера като се прибера (ама може да е към 10 ) ще ти кажа дали има по ново от твоето - ако си с D6 и с SP2 може би имаш проблем - ако не си направил update на библиотеката - мисля, че гледах нещо преди 2-3 месеца - но не знам дали не е за D7 ?

---
Е т'ва е живот!
Отговор
в отговор на z_free #14

Ето отговора....

Ето и информацията - значи версията е от 10.2002 - но май е публикувана наскоро ( за D7 нама update) - Version Info 7.0.2.113
Ако след инсталиране на този patch проблемите продължат - най добре е дса публикуваш в news групите на Борланд малко код - те ще ти кажат - но пробвай с някакъв tool да изпълниш тази процедура както беше подсказал някой от предните писали по въпроса.

=======================================================
Delphi 7
MSSQL Driver Update
Release Notes


=======================================================

This file contains important supplementary and late-
breaking information that may not appear in the main
product documentation, and supersedes information
contained in other documents, including previously
installed release notes, that accompany this product.
We recommend that you read this file in its entirety.

Important:

Delphi must be closed before installing this Update
Pack.


=======================================================
CONTENTS

* ISSUES ADDRESSED IN THIS UPDATE PACK
* FILES INSTALLED BY THIS UPDATE PACK

=======================================================
ISSUES ADDRESSED IN THIS UPDATE PACK

This update resolves two issues with the MSSQL driver.

* Unable to connect with Empty Username/Password:

In the previous driver, trying to connect with an
empty Username/Password resulted in an SQL error.

* Parameter binding into a VARCHAR column inserted an
extra trailing ASCII 0 character

Attempting parameter binding inserts into a
VARCHAR column would insert an ASCII 0 character at
the end of the data. For example, in a table with
Code defined as VARCHAR(12) and Description defined
as VARCHAR(50) the following code segment
demonstrates the problem.

sql.CommandText := 'INSERT INTO User1 (Code,
Description) ' + 'VALUES (:Code, :Description)';
sql.Params.ParamByName('Code').DataType := ftString;
sql.Params.ParamByName('Description').DataType :=
ftString;
sql.ParamByName('Code').AsString := 'TEST';
sql.ParamByName('Description').AsString := 'This is a
test';
sql.ExecSQL;

In the above example, sql is a TSQLDataSet or
TSQLQuery.

Any subsequent SELECT's, like SELECT * FROM User1
where Code ='TEST' would fail to find the record.

Installing this Update resolves these issues.

=======================================================
FILES INCLUDED IN THIS UPDATE PACK

* dbexpmss.dll

Replace these files in the Bin directory of your Borland
Delphi 7 installation with the files included in
this update. The default location for these files is:

C:\Program Files\Borland\Delphi7\Bin

=======================================================
Copyright (c) 2002 Borland Software Corporation.
All rights reserved.

---
Е т'ва е живот!

Редактирано от PhantomAS на

Отговор
в отговор на PhantomAS #15

Ами не съвсем отговора

Решава проблеми, но този мисля че не е свързан с dll-то. Въпреки това 10q.

-------------
Special killer double trouble triple extra nicotine monster!
Отговор