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

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

Как передать хранимой процедуре одиночные параметры + DataSet ? [D5, D6]


BPK ©   (2004-03-10 14:47:00) 

Имеются:
1. MS SQL Server 2000
2. хранимая процедура со входными параметрами
3. Delphi + ADO

Текущее состояние дел:
В клиентском приложении, написанном на Delphi, вызывается упомянутая хранимая процедура.
Ей передаём набор одиночных параметров, взятых из полей структуры (record).
ХП записывает эти поля в таблицу.

Требуется:
К структуре добавляем дополнительное поле - список (кто хочет, может считать, что это DataSet).
Этот список - тоже один из атрибутов объекта, описываемого данной структурой, и его тоже нужно записывать, но в другую таблицу со ссылками на первую.
Как передать на вход хранимой процедуры одновременно и набор одиночных параметров, и этот список?

Единственное плохое решение, пришедшее мне на ум:
Сделать дополнительную хранимую процедуру, заполняющую этот список, и вызывать её сразу после основной ХП.

Чем плохо такое решение:
В промежутке между вызовами БД может быть изменена, приложение зависнет, рухнет сеть, и т.п.
В результате БД расползётся.
Нужно обязательно делать всё за одну транзакцию.


ZrenBy   (2004-03-10 15:38:00) [1]

Можно проще, если сам себе хозяин


...
AssignFile(tfXML,FileXML);
ReWrite(tfXML);
Write(tfXML,'');
Write(tfXML,'');
for n:=1 to Count do begin
  Write(tfXML,''
  );
end;
Write(tfXML,'');
...

strXML:String;
//Грузим файл в strXML

var hFile : THandle;
   nSize : Integer;
begin
 hFile := FileOpen(FileXML,fmOpenRead);
 try
   nSize := FileSeek(hFile,0,2);
   FileSeek(hFile,0,0);
   SetLength(Result,nSize);
   FileRead(hFile,Result[1],nSize);
 finally
   FileClose(hFile);
 end;
end;

...
adoCommand.Open('exec MyStoredProc '+
  {@I_UID}  QuotedStr(UID)         +','+
  {@I_XML}  QuotedStr(strXML)
);

--
set nocount on
declare @I_XML varchar(8000)--в SP будет text

--будет нечто подобное
set @I_XML = '




Delirium   (2004-03-10 15:21:00) [2]

"Если это не поможет" - значит не разобрался.


Nikolay M.   (2004-03-10 15:19:00) [3]

Если пугает XML, можно еще через временные таблицы.


BPK   (2004-03-10 15:17:00) [4]

>по нему есть вопросы?
Mamma mia! Ну что, попытаюсь в этом разобраться.
Спасибо.
Если это не поможет, или не разберусь ;-) , то сформирую string, а в ХП сделаю анализ этого string.


Delirium   (2004-03-10 15:12:00) [5]

"Вас слово DataSet железно ассоциируется с базами данных" - да ничего у нас не ассоциируется, я вижу ты даже представить себе не можешь, что твоя проблемя уже давным-давно решена, одно из решений http://delphibase.endimus.com/?action=viewfunc&topic=basemssql&id=10400, по нему есть вопросы?


Delirium   (2004-03-10 15:06:00) [6]

> BPK   (10.03.04 15:03) [5]

Надо делать так, как сказал Polevi ©   (10.03.04 15:02) [3], готовая реализация на http://delphibase.endimus.com/, чего ещё?


BPK   (2004-03-10 15:06:00) [7]

>Этот датасет как-то оказался на клиенте. Значит был запрос к БД.

Нет. Мы его сами сформировали. Ну хорошо, не DataSet, а динамический массив, а вернее объект-хранилище, а то я вижу, что у Вас слово DataSet железно ассоциируется с базами данных.


Polevi   (2004-03-10 15:05:00) [8]

>BPK   (10.03.04 15:03) [5]
я тебе дело говорю, используй xml
один параметр в процедуре будет, не придется в будущем ничего трогать
но возможно ты еще не готов


Polevi   (2004-03-10 15:04:00) [9]

>Reindeer Moss Eater ©   (10.03.04 15:02) [4]
может это добавленные юзером данные


BPK   (2004-03-10 15:03:00) [10]

>А кто сказал, что два и более вызова хранимых процедур не могут идти в одной транзакции?

А как? В смысле, как организовать транзакцию из приложения Delphi?

P.S.
Обратите внимание, что поле списка в record'е это указатель на объект-список, из к-рого мы формируем ОТДЕЛЬНЫЙ DataSet или что-нибудь подобное.


Polevi   (2004-03-10 15:02:00) [11]

передавай xml данные ntext параметром
в процедуре используй sp_xml_preparedocument, sp_xml_removedocument и FOR XML запросы


Reindeer Moss Eater   (2004-03-10 15:02:00) [12]

К структуре добавляем дополнительное поле - список (кто хочет, может считать, что это DataSet).

Этот датасет как-то оказался на клиенте. Значит был запрос к БД.
Почему этот датасет надо тянуть на клиента что бы потом передать взад на сервер хранимой процедуре?
Что, разве нельзя открыть курсор прямо в первой sp?


Reindeer Moss Eater   (2004-03-10 15:00:00) [13]

А кто сказал, что два и более вызова хранимых процедур не могут идти в одной транзакции?


Delirium   (2004-03-10 14:54:00) [14]

http://delphibase.endimus.com/


Наверх

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