2010-10-15 17 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」

很想看到比這更「清潔」的答案!

相關問題