Как настроить ASP.NET SQL Datasource для приема TVP - PullRequest
8 голосов
/ 13 июля 2010

В коде позади вы добавили бы TVP как SqlDbType.Structured для хранимой процедуры. Но это не существует в элементе управления SqlDataSource ASP.NET.

Я сохранил свои таблицы данных в переменных сеанса (не волнуйтесь, они маленькие!), И мне нужно передать их в качестве параметров в SqlDataSource (который имеет несколько объектов с привязкой к данным)

Я указал источник данных на переменную сеанса, но он не работает при преобразовании в тип таблицы.

EDIT: Допустим, я взял переменную Session из уравнения (потому что, на самом деле, она полностью тангенциальная)

Должен быть способ, которым я могу присоединить DBType.Structured к источнику SQLDataSource. Мои списки просмотра соответственно привязаны к данным, но процедуры хранения, к которым они прикреплены, должны принимать TVP

Не могу поверить, что не было бы способа отправить параметр TVP для источника SQLDataSource? Каковы мои альтернативы?

EDIT2: Я пытался создать пользовательский параметр для SqlDataSource, но мне все еще кажется, что его метод "eval" не будет удовлетворен структурным типом данных

EDIT3: Начинает казаться, что мой единственный вариант - сделать всю работу в коде позади моих элементов управления с привязкой к данным. Я добавил вознаграждение на случай, если у кого-то еще есть элегантное решение.

EDIT4: Может быть, есть способ, которым я могу передать таблицу как объект в хранимую процедуру, а затем сделать так, чтобы SQL Server преобразовал ее в TVP?

Ответы [ 2 ]

5 голосов
/ 31 августа 2010

Я знаю, что вы отредактировали, чтобы сказать, что сессия не имеет значения, однако я смог заставить это работать, используя SessionParameter.У меня есть ощущение, что он также будет работать с ControlParameter.

Итак, у вас есть определенный пользователем тип таблицы:

CREATE TYPE TVPType AS TABLE(
    Col1 int,
    Col2 int)
GO

и хранимая процедура, которая его использует:

CREATE PROC TVPProc(@TVP AS TVPType READONLY) AS
    SELECT * FROM @TVP

затем GridView привязывается к SqlDataSource, который выбирает из вашего sproc, передавая SessionParameter:

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" />
<asp:SqlDataSource ID="SqlDataSource1" SelectCommand="TVPProc" runat="server" SelectCommandType="StoredProcedure" ConnectionString="Server=(local)\sqlexpress;Database=Graph;Integrated Security=True">
    <SelectParameters>
        <asp:SessionParameter SessionField="MyDataTable" Name="TVP" />
    </SelectParameters>
</asp:SqlDataSource>

и, наконец, кое-что для помещения DataTable в сеанс, хотя вы говорите, что у вас уже естьв любом случае:

(VB)

<script runat="server">
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim MyDataTable As New System.Data.DataTable

        MyDataTable.Columns.AddRange({
            New System.Data.DataColumn("Col1", GetType(integer)),
            New System.Data.DataColumn("Col2", GetType(integer))})

        MyDataTable.Rows.Add(22, 33)
        MyDataTable.Rows.Add(44, 55)
        MyDataTable.Rows.Add(66, 77)

        Session("MyDataTable") = MyDataTable
    End Sub
</script>

(C #)

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        System.Data.DataTable MyDataTable = new System.Data.DataTable();
        MyDataTable.Columns.AddRange(
            new System.Data.DataColumn[] {
                new System.Data.DataColumn("Col1", typeof (int)),
                new System.Data.DataColumn("Col2", typeof (int))});

        MyDataTable.Rows.Add(22, 33);
        MyDataTable.Rows.Add(44, 55);
        MyDataTable.Rows.Add(66, 77);

        Session["MyDataTable"] = MyDataTable;
    }
</script>

, что приводит к точному связыванию GridView:

alt text

и следующий сгенерированный запрос от Profiler:

declare @p1 dbo.TVPType
insert into @p1 values(22,33)
insert into @p1 values(44,55)
insert into @p1 values(66,77)

exec TVPProc @TVP=@p1

Это .NET 4, MSSQL Express 2010, но также должен работать ниже.

0 голосов
/ 26 августа 2010

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

...