【问题标题】:Can ObjectDataSource use table-valued parametersObjectDataSource 可以使用表值参数吗
【发布时间】:2010-10-15 03:15:57
【问题描述】:

如果 ASP.NET 网页使用ObjectDataSource,您能否将其配置为使用使用表值参数的存储过程?

用户自定义类型:

CREATE TYPE [dbo].[integer_list_tbltype] AS TABLE
(
 [n] [int] NOT NULL,
 PRIMARY KEY CLUSTERED 
)

存储过程:

CREATE PROCEDURE [dbo].[GeneralReport]  
@intList integer_list_tbltype READONLY
AS
BEGIN
    SELECT * FROM ...
END

ASP.NET

<asp:ObjectDataSource ID="GeneralDataSource" runat="server" 
    SelectMethod="GetDataByRange" 
    TypeName="MyProject.GeneralDataSetTableAdapters.GeneralViewTableAdapter" 
    >
    <SelectParameters>
        <asp:Parameter Name="intList" />            
    </SelectParameters>
</asp:ObjectDataSource>

我已经尝试像这样连接到 ObjectDataSource 的 Selecting 事件:

protected void GeneralDataSource_Selecting( object sender, System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs e )
{
    var zeroList = new List<SqlDataRecord>();
    var tvp_definition = new[] {new SqlMetaData( "n", SqlDbType.Int )};
    var sqlDataRecord = new SqlDataRecord( tvp_definition );
    sqlDataRecord.SetInt32( 0, 0 );

    zeroList.Add( sqlDataRecord  );

    e.InputParameters[ "intList" ] = zeroList;        
}

但这只会导致“System.ArgumentException:必须为 UDT 参数设置 UdtTypeName 属性”。被扔了

【问题讨论】:

  • 澄清一下,这是由 ReportViewer 控件使用的。 rdlc 文件喜欢使用 DataSets 将数据绑定到报告 - 这就是我使用 ObjectDataSource 的原因

标签: asp.net tsql objectdatasource table-valued-parameters


【解决方案1】:

我不知道你为什么要这样做。请参阅 Lenni Lobel 的 blog post,看看它是否适合您。

*更新:*对于报告,我使用 Codebetter.com 上显示的this 技术

【讨论】:

  • 我正在使用 ObjectDataSource,因为 ReportViewer 控件正在使用它在页面上显示报告
  • 简单的旧 ADO.net 代码和选择返回的结果集将足以满足您的报表查看器的需要。我想知道为什么你需要 SQL UDT。
  • 哦,好的。我想传递不同数量的参数来过滤报告……例如。只显示订单 1,2,4,6,4
  • 那是一篇有趣的文章,也许我最终会改用它。谢谢(如果有人可以回答原始问题,现在将留下未回答的问题)
【解决方案2】:

为了完整起见,这是一个可能的解决方案(尽管它可能确实属于“可怕”类别!)

覆盖由强类型数据集生成的表适配器。例如。

public class GeneralViewTableAdapter2 : GeneralViewTableAdapter
{
    public override GeneralDataSet.GeneralViewDataTable GetDataByRange( object intList )
    {
        try
        {
            return base.GetDataByRange( intList );
        }
        catch ( ArgumentException e )
        {
            foreach ( SqlParameter parameter in this.Adapter.SelectCommand.Parameters )
            {
                if ( parameter.SqlDbType == SqlDbType.Structured )
                    parameter.TypeName = "integer_list_tbltype";
            }

            return base.GetDataByRange( intList );
        }
    }
}

然后更新 ObjectDataSource 控件上的 Type 属性以引用这个新类。例如。 "MyProject.GeneralDataSetTableAdapters.GeneralViewTableAdapter2"

希望看到比这更“干净”的答案!

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多