Как настроить ASP.NET Источник данных SQL для принятия TVP

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

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

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

Править: Скажем, я вынимаю Переменную сеанса из уравнения (потому что, действительно, это является абсолютно тангенциальным),

Должен быть способ, которым я могу присоединить DBType. Структурированный к SQLDataSource. Мои Listviews соответственно связаны с данными, но процедуры хранилища, к которым они присоединяются, должны взять TVP's

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

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

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

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

9
задан David Gardiner 15 October 2010 в 02:44
поделиться

2 ответа

Я знаю, что вы отредактировали, сказав, что сеанс не имеет значения, однако я смог заставить это работать, используя 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, но он должен работать и ниже.

6
ответ дан 4 December 2019 в 23:38
поделиться

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

0
ответ дан 4 December 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: