代码之家  ›  专栏  ›  技术社区  ›  Matthew

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

  •  8
  • Matthew  · 技术社区  · 14 年前

    在codebehind中,您可以将TVP作为sqldbtype.structured用于存储过程。 但这在ASP.NET sqldatasource控件中不存在。

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

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

    编辑: 假设我把会话变量从方程中去掉(因为,实际上,它是完全切向的)

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

    我不能相信没有办法发送TVP参数来获取sqldatasource? 我的选择是什么?

    编辑2: 我一直在研究为sqldatasource创建自定义参数,但在我看来,它的“eval”方法对结构化数据类型不满意

    EdTe3: 现在看来,我唯一的选择是在codebehind中为数据绑定控件完成所有工作。我加了一个赏金,以防其他人有一个优雅的解决方案。

    编辑4: 是否有一种方法可以将表作为对象传递给存储过程,然后让SQL Server将其转换为TVP?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Samu Lang    14 年前

    我知道你已经编辑过说会话不重要,但是我可以使用sessionparameter来完成这个工作。我有一种感觉,它也可以与ControlParameter一起工作。

    所以您有一个用户定义的表类型:

    创建类型tvptype as table( COL1 INT, COL2 INT) 去 < /代码>

    以及使用它的存储过程:

    create proc tvp proc(@tvp as tvptype readonly)as
    从@tvp选择*
    < /代码> 
    
    

    然后,一个网格视图绑定到一个从存储过程中选择的sqldatasource,并传递一个sessionparameter:。

    <asp:gridview id=“gridview1”runat=“server”datasourceid=“sqldatasource1”/>gt;
    <asp:sqldatasource id=“sqlddatasource1”selectcommand=“tvpproc”runat=“server”selectcommandtype=“storedprocedure”connectionstring=“server=(local)\sqlexpress;database=graph;integrated security=true”>
    <选择参数>
    <asp:sessionparameter sessionfield=“mydataTable”name=“tvp”/>
    </selectparameters>
    </asp:sqldatasource>
    < /代码> 
    
    

    最后还有一点要把数据表放到会话中,尽管你说你已经有了它:

    (VB)

    <script runat=“server”>
    受保护的子页加载(byval sender作为对象,byval e作为system.eventargs)
    将mydataTable变暗为新的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)行
    
    会话(“MyDataTable”)=MyDataTable
    结束子
    & /脚本& GT;
    < /代码> 
    
    

    (C<)

    <script runat=“server”>
    受保护的空页加载(对象发送程序,事件参数e)
    {
    system.data.dataTable mydataTable=新建system.data.dataTable();
    myDataTable.Columns.AddRange(
    新建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)行;
    
    会话[“MyDataTable”]=MyDataTable;
    }
    & /脚本& GT;
    < /代码> 
    
    

    从而形成一个精细的网格视图:

    以及以下从探查器生成的查询:

    declare@p1 dbo.tvptype
    插入@p1值(22,33)
    插入@p1值(44,55)
    插入@p1值(66,77)
    
    exec tvpproc@tvp=@p1
    < /代码> 
    
    

    这是.NET 4,MSSQL Express 2010,但也应该工作得更低。

    但是,我可以使用sessionparameter来完成这个工作。我觉得它也可以和一个控制参数一起工作。

    所以您有一个用户定义的表类型:

    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>
    

    最后还有一点要把数据表放到会话中,尽管你说你已经有了它:

    (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>
    

    从而形成一个精细的网格视图:

    alt text

    以及以下从探查器生成的查询:

    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,但也应该工作得更低。

        2
  •  0
  •   ZXX    14 年前

    使中介类或适配器成为您已经拥有的任何自动数据边界的源。然后,您将完全控制为存储过程准备arg的方式与它所需要的方式完全相同。

    推荐文章