Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Вниз

Возврат параметров из хр. процедуры 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.044 c
14-1135983924
Profi
2005-12-31 02:05
2006.01.22
Всех С Новым 2006 Годом!


14-1135641619
PHOTOSHOP
2005-12-27 03:00
2006.01.22
[PHOTOSHOP] Как найти цвет, которого нет?


14-1135615175
Mystic
2005-12-26 19:39
2006.01.22
Небольшой вопросик по Delphi


6-1128867844
denissoft
2005-10-09 18:24
2006.01.22
Как получить данные


2-1136555628
DoSpyRap
2006-01-06 16:53
2006.01.22
Как открыть приложение через программу???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский