2010-07-13 4 views
7

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

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

Я указал Datasource к переменной сеанса, но при преобразовании в тип таблицы он не работает.

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

Там должен быть способ, которым я могу прикрепить DBType.Structured к SqlDataSource. Мои просмотры представляют собой соответствующие привязки данных, но процедуры хранения, к которым они присоединены, должны принимать TVP

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

EDIT2: Я искал в создании пользовательских параметров для SqlDataSource, но она по-прежнему кажется мне, как его метод «Eval» не будет счастлив с типом структурированных данных

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

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

+1

Существует множество причин, по которым очень мало людей используют эти элементы управления и почему люди не хранят таблицы данных в сеансе. Возможно, настало время перейти к следующему шагу в вашем образовании в области развития. – NotMe

+2

Я понимаю причины отказа от хранения данных в сеансах; это контролируемая среда, где мое использование является подходящим. Что касается вашего утверждения о том, что «очень мало людей все еще используют эти элементы управления», я никогда этого не слышал. Вы предполагаете, что существует проблема с использованием элемента управления SqlDataSource? Учитывая, что он работает достаточно хорошо практически во всех ситуациях, для которых он был разработан, я не вижу вашей точки против него. С другой стороны, я открыт для ваших предложений о том, как наилучшим образом привязать несколько элементов управления к данным так же элегантно, как SqlDataSource. – Matthew

+1

. SqlDataSource предшествует табличным параметрам за многие годы, я не удивлюсь, что возможности не существует и не добавлено. – womp

ответ

4

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

(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 @[email protected] 

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

+0

Это работает! Таким образом, кажется, что проблема в том, что источник данных по умолчанию запрашивает тип данных для параметров. Если он удален и намеренно заглушен, функции sds работают правильно. Спасибо Я активировал щедрость и отметил вас как ответ – Matthew

+0

Как важное примечание: Это * только * кажется, работает с параметром поля сеанса и без указания типа. Кроме того, поля сеанса должны быть настроены на данные, соответствующие правильным размерам при загрузке формы. Чтобы учесть это (в тех случаях, когда поля сеанса не подходят), я временно устанавливаю поле сеанса, восстанавливает элементы управления, а затем удаляю поле сеанса – Matthew

0

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

+0

Это уклоняется от использования SDS с TVP, правда? Я уже знаю, что я могу писать классы для источника моих объектов привязки данных ... проблема заключается в том, что данные передаются в существующий объект источника данных. – Matthew

+0

Когда вы сталкиваетесь с раздутыми слоями, искусство уклонения - великая добродетель :-) Технически вы можете получить SqlDataSourceView и переопределить ExecuteSelect и т. Д., Чтобы он все еще выглядел и выглядел как quacks, как SqlDataSourceView. Вы можете прочитать текущую реализацию в Reflector и искать место для мод. – ZXX