Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.22;
Скачать: CL | DM;

Вниз

Возврат параметров из хр. процедуры MSSQL   Найти похожие ветки 

 
LionMen ©   (2005-12-30 08:51) [0]

Здравствуйте! У меня такой вопрос. Как в программе написать коды, чтобы при запуска хр. процедуры возвращали параметры, то есть отфильтрованные. У меня возвращает только один параметр.
Программу я не дописал, так как не знаю что дальше писать. Примерно так:
 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!!!


 
evvcom ©   (2005-12-30 09:12) [1]


> У меня возвращает только один параметр.

В твоем коде нет возвращаемых параметров, только входной один.

> CREATE PROCEDURE

и

> RETURN @Name

Ты @Name что ли хочешь получить назад? Я точно не помню, но по-моему то, что ты написал безсмысленно. У тебя процедура и ты хочешь вернуть что-то через return. Это же не функция. В процедуре параметры возвращаются так:
CREATE PROCEDURE ASR_TC_ROUT_STR_IZV
@obozn varchar (20)
@name int OUT
AS

Посмотри синтаксис, вроде там я указал OUT


 
Ega23 ©   (2005-12-30 09:14) [2]

1. На каждый Open Cursor должен быть свой Close Cursor.
2. Читай про output-параметры.
3. Лучше воспользуйся DataSet"ом


 
Begin   (2005-12-30 10:32) [3]

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


 
LionMen ©   (2005-12-30 11:40) [4]

2 All

В делфи есть демо-прога ADODBTest, я смотрел, там в основном DataSetом используется, я бы хотел поподробнее об этом функции, т к в учебниках мало написано. Дело в том, что это прога  выводит все записи в DBGrid, а мне надо в Excel. Так вот, для пробы хотел в ListBox выводил хотя бы одно поле, т е F_KEY из таблицы, отфильтрованные, например, только "31.0001-05".
Я писал программу напрямую с таблицами, только долго работает, полминуты ждать пока прога обрабатывает, т е фильтрует и выводит список F_key в Excel. Я думаю, вы поняли, хочу немного быстрее, какими функциями лучше использовать? Я использую с компонентами ADO. Плиз, опишите все, буду благодарен!


 
MOA ©   (2005-12-30 12:09) [5]

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 14:29) [6]

Я вижу , вы меня не поняли, или я неправильно сформулировал вопрос.
Вот прога, которую я написал напрямую с таблицей: Медленее работает!!!


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 тоже работала процедура или функция с возвратом. А у меня их нет.


 
sniknik ©   (2005-12-30 15:06) [7]

датасет однозначно лучше, на все тейблы/сторедпроцы забей.

то что ты хочеш (выборка и перенос в ексель) делается так (если не ошибся гденибудь в букве другой ;)
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 ©   (2006-01-09 09:29) [8]

Здравствуйте! С Новым Годом и Рождеством Христовым!

Для 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"!!! (((



Страницы: 1 вся ветка

Текущий архив: 2006.01.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
10-1112243476
AloneAli
2005-03-31 08:31
2006.01.22
OLE+Excel


14-1135538589
Ihor Osov'yak
2005-12-25 22:23
2006.01.22
Есть пробел в знаниях.


1-1134848905
Mmmaloy
2005-12-17 22:48
2006.01.22
Симуляция нажатия кнопки на DBGrid


1-1134740100
_max_
2005-12-16 16:35
2006.01.22
Расположение компонентов на форме


5-1121079938
Dimk
2005-07-11 15:05
2006.01.22
Как использовать созданные в Delphi компоненты в C++ Builder