Mat*_*hew 9 sql asp.net sqldatasource table-valued-parameters
在代码隐藏中,您将TVP添加为存储过程的SqlDbType.Structured但这在ASP.NET SqlDataSource控件中不存在.
我已将我的Datatables存储在会话变量中(不要担心它们很小!)我需要将它们作为参数传递给SqlDataSource(它有许多数据绑定对象)
我将Datasource指向了session变量,但在转换为表类型时失败了.
编辑:假设我将Session变量从等式中取出(因为,实际上,它完全相切)
必须有一种方法可以将DBType.Structured附加到SQLDataSource.我的列表视图是适当的数据绑定,但它们附加的商店程序必须采用TVP
我无法相信没有办法为SQLDataSource发送TVP参数?我有什么选择?
EDIT2:我一直在寻找为SqlDataSource创建一个自定义参数,但在我看来,它的"eval"方法对结构化数据类型不满意
EDIT3:我的唯一选择就是为我的数据绑定控件完成代码隐藏的所有工作.我添加了赏金以防其他任何人有一个优雅的解决方案.
编辑方式4:或许,有一种方法可以将表作为对象传递给存储过程,然后让SQL Server将其转换为TVP吗?
我知道你已经编辑过说会话并不重要,但是我能够使用SessionParameter来实现这一点.我有一种感觉它也适用于ControlParameter.
所以你有一个用户定义的表类型:
CREATE TYPE TVPType AS TABLE(
Col1 int,
Col2 int)
GO
Run Code Online (Sandbox Code Playgroud)
以及使用它的存储过程:
CREATE PROC TVPProc(@TVP AS TVPType READONLY) AS
SELECT * FROM @TVP
Run Code Online (Sandbox Code Playgroud)
然后一个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>
Run Code Online (Sandbox Code Playgroud)
最后有一些东西将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>
Run Code Online (Sandbox Code Playgroud)
(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>
Run Code Online (Sandbox Code Playgroud)
这导致精细绑定的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
Run Code Online (Sandbox Code Playgroud)
这是.NET 4,MSSQL Express 2010,但也应该更低.