![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Stored procedure (MSSQL2000): произвольный набор параметров
BPK © (2004-04-16 10:31:00)Дано:
1. MS SQL Server 2000
2. ADO
3. Delphi 5
Надо:
иметь возможность передавать хранимой процедуре совершенно произвольный набор совершенно произвольных параметров.
В ADO это можно сделать с помощью CreateParameter, но при объявлении ХП в MS SQL Server нужно чётко указать, какие параметры используются. Как быть? Хотелось бы обойтись без XML и других подобных извращений.
Delirium (2004-04-16 12:19:00) [1]"Base64" - на самом деле для полей binary, varbinary и image - MSSQL воспринимает обычный HEX, а именно в HEX-е хранятся BLOB-ы при ADO-шной сериализации, так что процедура по линку из 11-го поста работает и с BLOB-ами.
Hooch (2004-04-16 12:13:00) [2]>> Ну и как запихать BLOB в XML?
Base64
Я раньше тоже через временные делал, но через XML удобнее, когда привыкнеш :-)
Nikolay M. (2004-04-16 12:04:00) [3]
> "Хотелось бы обойтись без XML и других подобных извращений"
> - с вышеозначеной постановкой задачи, обходиться без XML
> будет либо - неуч, либо - извращенец. 8)
Если ты первое, второе или третье, то возможен вариант с псведовременными таблицами такого примерно формата:
ID, SPID, param_name, param_value
где SPID - сессия коннекта.
Заполняешь таблицу значениями, вызываешь процедуру, она их считывает.
Delirium (2004-04-16 12:02:00) [4]В 11-й пост!
BPK (2004-04-16 11:57:00) [5]> Я тебе кинул линк
Куда кинул? Я свой e-mail не указывал.
Delirium (2004-04-16 11:55:00) [6]Я тебе кинул линк
BPK (2004-04-16 11:54:00) [7]> "Через XML делать не стану" - откровенная глупость.
Ну и как запихать BLOB в XML?
Delirium (2004-04-16 11:39:00) [8]"Через XML делать не стану" - откровенная глупость.
"будет ли у каждого пользователя свой экземпляр (надо), или таблица будет общая (не надо)" - читай хелп про # и ##.
P.S.
"ПодготовитьВызов
ПослатьПараметр('Par1',156)
ПослатьПараметр('Par2','the string')
ПослатьПараметр('Par1',True)
ВызватьПроцедуру" - ахинея это, если хочешь через временные таблицы работать, опять таки надо пользовать XML, но теперь ADO-шный ( http://delphibase.endimus.com/?action=viewfunc&topic=basemssql&id=10400).
BPK (2004-04-16 11:31:00) [9]>апдейт накотить надо
наверное от слова "кот"...
ломает меня update накатывать. Геморройно это получается. Что ни полезная идея, то апдейт, причём его ещё нужно где-то искать.
Через XML делать не стану, т.к. сам XML передаётся через varchar/nvarchar, но у меня возникла идея: что если добавлять параметры поодиночке - отдельными вызовами ХП, а затем послать запрос на вызов ХП:
ПодготовитьВызов
ПослатьПараметр('Par1',156)
ПослатьПараметр('Par2','the string')
ПослатьПараметр('Par1',True)
ВызватьПроцедуру
Всё это вызовы отдельных ХП.
Хранить параметры можно во временной таблице. Но только вот в связи со временной таблицей есть несколько непонятных моментов:
1. Я слышал, что временная таблица существует только на время сессии, а затем уничтожается. Как сделать так, чтобы таблица не уничтожалась с момента "ПодготовитьВызов" до момента "ВызватьПроцедуру" (а затем всё-таки была автоматически уничтожена - вдруг что-нибудь зависнет, и я не смогу сделать drop)
2. Система многопользовательская. Если создаётся временная таблица, то будет ли у каждого пользователя свой экземпляр (надо), или таблица будет общая (не надо)?
Hooch (2004-04-16 11:17:00) [10]внутри sql server читай BOL, генерить xml на клиенте можно и ручками, если рабирать на клиенте ипортируй библиотеку типов ms xml 3 и все. да, что б на sql server нормально работаь с xml обязательно !!! 3 апдейт накотить надо
Delirium (2004-04-16 10:57:00) [11]
declare @XMLHandle int
exec sp_xml_preparedocument @XMLHandle OUTPUT, '
<Order>
<Product>
<Name>String1</Name>
<Price>111</Price>
</Product>
<Product>
<Name>String2</Name>
<Price>222</Price>
</Product>
</Order>'
select *
from openxml(@XMLHandle, 'Order/Product', 2)
with (Name varchar(8000),
Price money)
exec sp_xml_removedocument @XMLHandle
BPK (2004-04-16 10:55:00) [12]Ещё раз повторяю вопрос:
чем парсить/кодировать XML? Вручную лень. Есть ли готовые средства, которые можно применить внутри ХП и в приложении Delphi?
Delirium (2004-04-16 10:54:00) [13]"Хотелось бы обойтись без XML и других подобных извращений" - с вышеозначеной постановкой задачи, обходиться без XML будет либо - неуч, либо - извращенец. 8)
BPK (2004-04-16 10:54:00) [14]Пардон, а чем парсить/кодировать XML? Вручную лень. Есть ли готовые средства, которые можно применить внутри ХП и в приложении Delphi?
Hooch (2004-04-16 10:52:00) [15]в данном случае XML лучшее решенье ! :-)
BPK (2004-04-16 10:51:00) [16]По порядку:
1. Понадобиться это может затем, что в БД хранятся сведения об объектах, причём каждый из объектов может иметь от нуля до N параметров произвольного типа (int, float, image, nvarchar и т.д.)
2. Через строчный параметр не годится: у него ограничена длина, и кроме того придётся использовать разделители. А разделители могут встретиться и внутри самого значения параметра.
tERRORist (2004-04-16 10:38:00) [17]Перредавай один строчный параметр, а его уже парсь в ХП
bushmen (2004-04-16 10:34:00) [18]Только возникает вопрос - а ЗАЧЕМ такое может понадобится?