Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вызов CLR функции с параметром массива  [new]
Testor1
Member

Откуда:
Сообщений: 679
Привет


Есть CLR функция

public static String test2(String resourceName, feature[] features)
{
КОД
}


Есть определение feature. Как при определении CLR функции в SQL 2008 R2 прописать параметр feature? Как передавать значения feature в созданную sql функцию?

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://blabla")]
public partial class feature {

private string featureCodeField;

private featureParameter[] featureParametersField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string featureCode {
get {
return this.featureCodeField;
}
set {
this.featureCodeField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("featureParameters", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
public featureParameter[] featureParameters {
get {
return this.featureParametersField;
}
set {
this.featureParametersField = value;
}
}
}
3 июн 11, 17:01    [10760659]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Testor1, ну вродь как примеры же есть, али не читали?
Глядеть тута.
3 июн 11, 17:09    [10760712]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
Testor1
Member

Откуда:
Сообщений: 679
kDnZP,
Примеры для 2005.
У меня SQL 2008 R2 и VS 2010. Это имеет значение?
3 июн 11, 17:12    [10760735]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Testor1
У меня SQL 2008 R2 и VS 2010. Это имеет значение?

Осспади, ну ессесно все будет работать! Обратная совместимость, все дела...
не, ну программеры пошли...
3 июн 11, 18:20    [10761170]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
Testor1
Member

Откуда:
Сообщений: 679
SamMan,

Можно небольшой примерчик тут ?
Что-то не получается :(
3 июн 11, 22:55    [10762063]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Testor1, смотрите у себя:
C:\Program Files\Microsoft SQL Server\150\Samples\Engine\Programmability\CLR\ArrayParameter\
Найти в нете тяжеловато.
Но я что-то сомневаюсь что там что надо.

А вам зачем это понадобилось?
4 июн 11, 02:39    [10762451]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Mnior, тут оно лежит
4 июн 11, 11:24    [10762702]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
kDnZP, точнее вот: Readme_Array Parameter Sample
А смысл? Да я могу скачать msi архив на xx метров, но это можно и с самого MS сайта сделать.
И как мне на *nix-е открыть этот архив и выкусить 10 строк кода? И всё равно в опен-нете этого кода нет.
Лучше уж пусть кто-то выкусит и выложит явно сюда.

Всё ещё продолжаю сильно сомневаться, что там ответ на вопрос ТС.
4 июн 11, 15:36    [10763084]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
csmru
Member

Откуда:
Сообщений: 1
cпасибо
4 июн 11, 18:35    [10763470]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Mnior, ну вот тут есть в виде zip-архива. Перевыложить мне, ессно не проблема. Вопрос в том, нужно ли?
4 июн 11, 19:48    [10763669]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
Testor1
Member

Откуда:
Сообщений: 679
kDnZP,

Спасибо. Поставил, но все равно не до конца разобрался. :(


У меня есть WSDL сервиса на java. Для него я получил .cs файл.
Далее я создаю CLR функции, которые дергают полученные методы.
Вызывать обычные методы из sql 2008 r2 получается.
А вот как передать массив переменых определеных в wsdl - не могу понять.

Если не сложно, на очень простом примере и коротко можете показать, что и где нужно прописать?
Второй вопрос, а как передавать массив аттачментов ?
4 июн 11, 20:45    [10763827]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Перенесите в форум .Net

Testor1
У меня есть WSDL сервиса на java. Для него я получил .cs файл.
Далее я создаю CLR функции, которые дергают полученные методы.
Вызывать обычные методы из sql 2008 r2 получается.
А вот как передать массив переменых определеных в wsdl - не могу понять.
FacePalm

Testor1, интерфейсы С# и его взаимодействия с WSDL к самому SQL и его интерфейсам не имеет совершенно никакого отношения.
Задача вашей CLR прослойки между SQL и WSDL как раз и заключается, чтобы соединить эти два несовместимых интерфейса. А не навязать его кокой либо стороне (в данном случае массивы скулю).

Ваша задача не создать механиз передачи массивов в SQL, а передать данные из SQL (таблиц) к web сервису и обратно (в таблицы). В примере который представил kDnZP, показан пользовательский тип данных - массив. Эти данные как чёрный ящик - с ними ничего не сделаешь - кирпич, или нужно постоянно загружать скуль ненужной работой по их распаковыванию и запаковыванию. Зачем? Правильно, нужно сразу передать данные в удобном для SQL виде.

Пусть ваша CLR функция сама читает данные из скуля (на основании переданных параметров) через например ExecuteReader в массив и вызывает ваш Web Method. А результат возращает через out параметры, или если это наборы данных, то через SqlPipe или даже лучше как табличная функция.
В наикрайнем случае, в качестве исключения, можете тупо строку передать, в виде зачений через запятую, через один строковый параметр.

+
Решаю я взаимодействие Web сервисов со скулем немного другим способом. Написав раз в жизни одну процедуру: 5933931, вызываю любой метод очень просто не написав ни одной строчки компилирующего неповоротливого кода (пример в том же посте).
Есть способ (через Service Broker) вообще отделить взаимодействие с "внешкой" (хоть на другую машину), но он здесь не представлен.

Блин, CLR конечно вещь иногда необходимая, но это гиганская дырища, размер с землю, для всякого ..., который вообще не слышал, что такое декларативное программирование. Как MS с этим справиться.
5 июн 11, 02:07    [10764258]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
kDnZP
есть в виде zip-архива.
Старею. :(
kDnZP
Вопрос в том, нужно ли?
Такое точно не нужно. :)
Может не зря MS ложит это поглубже.
5 июн 11, 02:10    [10764259]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
Testor1
Member

Откуда:
Сообщений: 679
Mnior,

Да. В чем-то согласен с Вами.
В случае если мне нужно передать данные из таблицы - все понятно.
Как быть если мне нужно передать данные из временной таблицы? Создать промежуточную постоянную таблицу и в нее записывать временные данные. Считывать из CLR записи и потом удалять эти записи из постоянной таблицы? Решение есть, но оно не красивое.

В идеале, конечно проще было бы создать в скл указанный тип и передавать через него значение.
Но SQL зараза не видит определенный в wsdl тип в assembly, но видит мои созданные функции.
Может быть мне в моем классе нужно создать тип переменной - типа из WSDL?
5 июн 11, 14:42    [10764870]     Ответить | Цитировать Сообщить модератору
 Re: Вызов CLR функции с параметром массива  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Testor1
Как быть если мне нужно передать данные из временной таблицы?
Вопрос верный, в большей части не должен быть актуальным:
  • деклатавиный подход не создаёт промежуточных вычислений (увеличте скилл)
  • поменяйте порядок (сформировать даные (процедурно) -> CLR -> web) на (CLR -> сформировать даные (функционально) -> web)
  • Временные таблицы аля ## видны в любом контексте (это не совет, а просто к слову)
  • табличные параметры в CLR процедурах рекомендуемы, что-то типа:
    [SqlProcedure]
    public static void StoredProcedure(DataTable tvp, out int sum)
    {
        return 42;
    }
    
    CREATE TYPE MyTableType AS TABLE 
    (
        Id INT NOT NULL PRIMARY KEY,
        [Count] INT NOT NULL
    )
    GO
    CREATE ASSEMBLY ClrTest FROM '<somePath>'
    GO
    CREATE PROCEDURE ClrTest
    AS EXTERNAL NAME ClrTest.StoredProcedures.StoredProcedure
    GO
    спи...но, схемы не забудьте.
    DECLARE @TParam dbo.MyTableType
    INSERT @TParam VALUES (1,5),(2,12),(3,42)
    EXEC dbo.ClrTest @TParam
  • 5 июн 11, 16:00    [10765070]     Ответить | Цитировать Сообщить модератору
     Re: Вызов CLR функции с параметром массива  [new]
    Testor1
    Member

    Откуда:
    Сообщений: 679
    Mnior,

    Спасибо за внимание и поддержку.
    5 июн 11, 16:47    [10765158]     Ответить | Цитировать Сообщить модератору
     Re: Вызов CLR функции с параметром массива  [new]
    Testor1
    Member

    Откуда:
    Сообщений: 679
    Mnior,

    Еще один вопрос.

    Из вашего опыта как правильней для вызова SOAP методов для передачи данных?
    1. создать clr процедуры/функции, чтобы из SQL сервера вызывать методы
    2. создать сервис посредник, который с заданной периодичностью будет сканировать таблицу очереди сообщений и в случае появление новых сообщений и в зависимости от их типа будет дергать соотвествующие методы
    5 июн 11, 20:20    [10765713]     Ответить | Цитировать Сообщить модератору
     Re: Вызов CLR функции с параметром массива  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6724
    Testor1
    Mnior,
    Еще один вопрос.
    Из вашего опыта ...
    Давайте не переходить на личности, это форум. Аргументы и логика важнее всего.
    Testor1
    ... как правильней для вызова SOAP методов для передачи данных?
    2. ... таблицу очереди сообщений ...
    Превосходно, вопрос содержится в вариантах ответа.
    Как я понял у вас Service Broker и логический сервис (которому передают сообщения) отождествялется с внешним сервисом.

    Отдельный внешний сервис можно расположить на другой машине и даёт больше административных (и не только) вариантов/решений. Внешние системы порой представляют даные в очень неудобоваримых форматах и функциональных интерфейсах. И обработка может потребовать дополнительные ресурсы. Поэтому маштабируемость приветствуется. Распологает к модульности, что лучше сказывается на разарботке и поддержке.

    Но если цель например создать поставляемый монолитный продукт, то лишний элемент системы плохо сказывается на надёжности/портируемости.

    Testor1
    ... с заданной периодичностью ...
    Периодичность опроса не нужна для SB. Сервис автоматически создаёт системное уведомление о появлении нового сообщения в очереди, на которое приложение может подписаться.
    Активация на основе событий
    Пример.

    В случае внешего сервиса на первый результат уйдёт больше времени - холодный старт.
    6 июн 11, 00:41    [10766568]     Ответить | Цитировать Сообщить модератору
     Re: Вызов CLR функции с параметром массива  [new]
    Testor1
    Member

    Откуда:
    Сообщений: 679
    Mnior,

    Может на примере лучше будет понятно.

    Есть фирма, которая бронирует номера в гостиницах.

    От фирмы в гостиницу
    1. Оператор через Web интерфейс заполняет форму и сохраняет значение в очереди (таблице) базы данных
    2. Обработчик очереди видит новое сообщение на бронь и отправляет его в одну из гостиниц с коммандой посредством SOAP запроса. В зависимости от результата обновляется статус комманды в очереди.

    Я планировал написать CLR функции, которые дергали необходимые методы сервиса гостиницы.
    С другой стороны думаю, что идея с промежуточным сервисом более корректна. С технологией подписки обновлений не был знаком :(

    От гостиницы в фирму
    1. Гостиница с периодичностью раз в сутки дергает локальный сервис фирмы для передачи данных об освбодившихся номерах и ценах.

    В данном случае планировал написать обычный Web сервис и методы для обновления данных в локальной базе.

    ---
    В идеале, какой правильный подход решения задачи ?
    6 июн 11, 09:44    [10767331]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить