如何设置ASP.NET SQL数据源以接受TVP

在代码隐藏中,您可以将TVP添加为存储过程的SqlDbType.Structured但是,这不存在于ASP.NET SqlDataSource控件中。

我将数据表存储在会话变量中(不用担心它们很小!),我需要将这些参数作为参数传递给SqlDataSource(它有许多数据绑定对象)

我将数据源指向会话变量,但在转换为表类型时失败。

编辑:假设我将Session变量带出等式(因为它实际上完全是切向的)

必须有一种方法可以将一个DBType.Structured附加到一个SQLDataSource。 我的列表视图有适当的数据绑定,但它们所附属的存储过程必须采用TVP

我不相信有没有办法发送一个SQLDataSource的TVP参数? 我有什么选择?

编辑2:我一直在寻找创建SqlDataSource的自定义参数,但它仍然像我的“eval”方法不会满意结构化数据类型

编辑3:它开始出现,我唯一的选择是在我的数据绑定控件的代码隐藏中完成所有工作。 如果其他人有一个优雅的解决方案,我添加了一个赏金。

编辑4:有没有,也许,我可以将表作为对象传递给存储过程,然后让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

然后绑定到一个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,但也应该降低。


创建中介类或适配器,作为您已有的任何自动数据绑定的源。 然后,您完全可以控制准确地满足需求的方式。

链接地址: http://www.djcxy.com/p/46913.html

上一篇: How to set up ASP.NET SQL Datasource to accept TVP

下一篇: Git: How to ignore a file from one repo and add it to another?