セッションは重要ではないと編集したことは知っていますが、SessionParameterを使用してこれを機能させることができました。ControlParameter でも機能すると思います。
したがって、ユーザー定義のテーブル型があります。
CREATE TYPE TVPType AS TABLE(
Col1 int,
Col2 int)
GO
およびそれを使用するストアド プロシージャ:
CREATE PROC TVPProc(@TVP AS TVPType READONLY) AS
SELECT * FROM @TVP
次に、sproc から選択する SqlDataSource にバインドされた GridView で、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 ですが、それ以下でも動作するはずです。