Форум: "Начинающим";
Текущий архив: 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;
в MSSQLCREATE 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.042 c