Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возврат параметров из хр. процедуры 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо