![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возврат параметров из хр. процедуры MSSQL [D7, XP]
LionMen © (2005-12-30 08:51:00)Здравствуйте! У меня такой вопрос. Как в программе написать коды, чтобы при запуска хр. процедуры возвращали параметры, то есть отфильтрованные. У меня возвращает только один параметр.
Программу я не дописал, так как не знаю что дальше писать. Примерно так:
procedure TForm1.FormCreate(Sender: TObject);
begin
with ADOStoredProc1 do
begin
Parameters.Items[0].Value:='31.0001-05'; // Передает параметр в процедуру
ExecProc;
end;
end;
а в MSSQL процедуру:
CREATE PROCEDURE ASR_TC_ROUT_STR_IZV
@obozn varchar (20)
AS
Declare @name int
DECLARE CT CURSOR FOR SELECT f_key from TC_ROUTE_STRING_IZV where izv = @obozn
OPEN CT
WHILE 1=1 BEGIN
FETCH FROM CT INTO @name
IF @@fetch_status=-1
BREAK
IF @@fetch_status=-2
CONTINUE
RETURN @Name
END
DEALLOCATE CT
GO
Я вот не знаю , думаю, что надо использовать DataSet, подскажите пожалуйста!! Буду благодарен!
А вапще я хотел бы вывести все параметры в ListBox!!!
LionMen (2006-01-09 09:29:00) [1]Здравствуйте! С Новым Годом и Рождеством Христовым!
Для sniknik! Я вижу вы правильно поняли мой вопрос!
ADODataSet.CommandText:= 'SELECT f_key FROM TC_ROUTE_STRINGS_IZV WHERE izv=:obozn ORDER BY f_key';
ADODataSet.Parameters.ParamByName('obozn').Value:='31.0001-05';
ADODataSet.Open;
ExcelApplication1.Workbooks.Add(EmptyParam,0);
//Вместо Cells я поменял на Range, добавил параметры в CopyFromRecordset
ExcelApplication1.Cells[1,1].CopyFromRecordset(ADODataSet.Recordset, 1, 1);
Программка вроде ниче, токо вот выдается ошибка "OLE error 800A03EC"!!! (((
sniknik (2005-12-30 15:06:00) [2]датасет однозначно лучше, на все тейблы/сторедпроцы забей.
то что ты хочеш (выборка и перенос в ексель) делается так (если не ошибся гденибудь в букве другой ;)
ADODataSet.CommandText:= 'SELECT f_key FROM TC_ROUTE_STRING_IZV WHERE izv=:obozn ORDER BY f_key';
ADODataSet.Parameters.ParamByName('obozn').Value:='31.0001-05';
ADODataSet.Open;
ExcelApplication1.Workbooks.Add(EmptyParam,0);
ExcelApplication1.Cells[1,1].CopyFromRecordset(ADODataSet.Recordset);
> Я хочу, чтобы в SQL тоже работала процедура или функция с возвратом. А у меня их нет.
она сдесь и не нужна.
но если хочется...
CREATE PROCEDURE ASR_TC_ROUT_STR_IZV @obozn varchar (20)
AS
SELECT f_key AS Name FROM TC_ROUTE_STRING_IZV WHERE izv=@obozn ORDER BY f_key
вот это то что ты пытался в [0] "изобразить"
LionMen (2005-12-30 14:29:00) [3]Я вижу , вы меня не поняли, или я неправильно сформулировал вопрос.
Вот прога, которую я написал напрямую с таблицей: Медленее работает!!!
procedure TForm1.FormCreate(Sender: TObject);
Var j:integer;
begin
ADOTable1.Active:=true;
ADOTable1.Locate('izv','31.0001-05', [loPartialKey]);
j:=0;
ExcelApplication1.Workbooks.Add(EmptyParam,0);
repeat
if ADOTable1.FieldValues['izv'] = '31.0001-05' then
begin
ExcelApplication1.Cells.Item[j+1,1]:=IntToStr(ADOTable1.FieldValues['f_key']);
j:=j+1;
end;
ADOTable1.Next;
until ADOTable1.Eof = true;
ADOTable1.Active:=false;
with ExcelApplication1 do
begin
Connect;
Visible[1]:=true;
Disconnect;
end;
end;
Думаю, если вы проанализируете в чем моя проблема, то вы можете мне подсказать лучший вариант! Я хочу, чтобы в SQL тоже работала процедура или функция с возвратом. А у меня их нет.
MOA (2005-12-30 12:09:00) [4]1. Процедура может вернуть только целое значение (Integer) - обычно код завершения удачно/неудачно
2. Чтобы вернуть датасет из процедуры
SELECT @Name
3. Если SQL2000 или 2005 и в процедуре нет модификаций таблиц БД - лучше воспользоваться User defined Function
4. Если хотите вернуть именно входной параметр - evvcom © (30.12.05 09:12) [1], Ega23 © (30.12.05 09:14) [2], Begin (30.12.05 10:32) [3]
Удачи!
LionMen (2005-12-30 11:40:00) [5]2 All
В делфи есть демо-прога ADODBTest, я смотрел, там в основном DataSetом используется, я бы хотел поподробнее об этом функции, т к в учебниках мало написано. Дело в том, что это прога выводит все записи в DBGrid, а мне надо в Excel. Так вот, для пробы хотел в ListBox выводил хотя бы одно поле, т е F_KEY из таблицы, отфильтрованные, например, только '31.0001-05'.
Я писал программу напрямую с таблицами, только долго работает, полминуты ждать пока прога обрабатывает, т е фильтрует и выводит список F_key в Excel. Я думаю, вы поняли, хочу немного быстрее, какими функциями лучше использовать? Я использую с компонентами ADO. Плиз, опишите все, буду благодарен!
Begin (2005-12-30 10:32:00) [6]
procedure TForm1.FormCreate(Sender: TObject);
begin
with ADOStoredProc1 do
begin
Parameters.Items[0].Value:='31.0001-05'; // Передает параметр в процедуру
Parameters.AddParameter;
proc.Parameters[1].Direction := pdOutput; ExecProc;
end;
end;
в MSSQL
CREATE PROCEDURE ASR_TC_ROUT_STR_IZV
@obozn varchar (20),
@name int OUTPUT
AS
select @name = (select f_key from TC_ROUTE_STRING_IZV where izv = @obozn)
GO
Ega23 (2005-12-30 09:14:00) [7]1. На каждый Open Cursor должен быть свой Close Cursor.
2. Читай про output-параметры.
3. Лучше воспользуйся DataSet'ом
evvcom (2005-12-30 09:12:00) [8]
> У меня возвращает только один параметр.
В твоем коде нет возвращаемых параметров, только входной один.
> CREATE PROCEDURE
и
> RETURN @Name
Ты @Name что ли хочешь получить назад? Я точно не помню, но по-моему то, что ты написал безсмысленно. У тебя процедура и ты хочешь вернуть что-то через return. Это же не функция. В процедуре параметры возвращаются так:
CREATE PROCEDURE ASR_TC_ROUT_STR_IZV
@obozn varchar (20)
@name int OUT
AS
Посмотри синтаксис, вроде там я указал OUT