2010-10-15 16 views
0

如果ASP.NET网页使用ObjectDataSource,您可以将其配置为使用使用表值参数的存储过程吗?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的这样的选择事件:

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:UdtTypeName属性必须设置为UDT参数”。被抛出

+0

为了澄清,ReportViewer控件正在使用此功能。 rdlc文件喜欢使用DataSets将数据绑定到报表 - 这就是为什么我使用ObjectDataSource – 2010-10-15 04:20:25

回答

1

我不知道你为什么希望这样做。看到Lenni Lobel的blog post,看看它是否适合你。

* UPDATE: *有关报告我用this技术在Codebetter.com

+0

我正在使用ObjectDataSource,因为ReportViewer控件正在使用它来在页面上显示报表 – 2010-10-15 04:16:53

+0

Plain old ADO。网络代码并选择返回结果集将满足您的报表查看器需求。我想知道为什么你需要SQL UDT。 – Perpetualcoder 2010-10-15 04:42:01

+0

哦,好的。我想通过不同数量的参数来过滤报告。只显示订单1,2,4,6,4 – 2010-10-15 05:03:07

0

为了完整起见,如图所示,这是一个可能的解决方案(虽然它可能确实落入了“恐怖”类! )

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

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”

很想看到比这更“清洁”的答案!

相关问题