В codebehind Вы добавили бы TVP как SqlDbType. Структурированный для хранимой процедуры, Но это не существует в управлении ASP.NET SqlDataSource.
Я сохранил свои Таблицы данных в переменных сеанса (не волнуйтесь, что они являются маленькими!) и я должен передать тех, которые как параметры к SqlDataSource (который имеет много связанных с данными объектов),
Я указал на Источник данных на переменную сеанса, но это перестало работать на преобразовании в тип таблицы.
Править: Скажем, я вынимаю Переменную сеанса из уравнения (потому что, действительно, это является абсолютно тангенциальным),
Должен быть способ, которым я могу присоединить DBType. Структурированный к SQLDataSource. Мои Listviews соответственно связаны с данными, но процедуры хранилища, к которым они присоединяются, должны взять TVP's
Я не могу полагать, что не было бы никакого способа отправить парамать TVP за SQLDataSource? Каковы мои альтернативы?
EDIT2: я изучал создание пользовательского параметра для SqlDataSource, но это все еще кажется мне как свой метод "оценки", не будет довольно структурированным типом данных
EDIT3: это начинает появляться, что моя единственная опция состоит в том, чтобы сделать всю работу в codebehind для моих связанных с данными средств управления. Я добавил щедрость в случае, если у кого-либо еще есть изящное решение.
EDIT4: Есть ли, возможно, способ, которым я могу передать таблицу как объект к хранимой процедуре, затем иметь SQL Server, преобразовывает его в TVP?
Я знаю, что вы отредактировали, сказав, что сеанс не имеет значения, однако я смог заставить это работать, используя 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:
и следующему сгенерированному запрос от 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, но он должен работать и ниже.
Создайте промежуточный класс или адаптер, который будет служить источником любых автоматических ограничений данных, которые у вас уже есть. Тогда у вас есть полный контроль над подготовкой аргументов для sproc именно так, как они ему нужны.