代码之家  ›  专栏  ›  技术社区  ›  David Gardiner

objectdatasource可以使用表值参数

  •  0
  • David Gardiner  · 技术社区  · 15 年前

    如果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的选择事件,如下所示:

    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参数设置”。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Perpetualcoder    15 年前

    我不知道你为什么要这样做。看这个 blog post 莱尼·洛贝尔,看看这对你是否有用。

    * 更新: *用于报告我使用 this 技术如codebeater.com所示

        2
  •  0
  •   David Gardiner    15 年前

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

    重写由强类型数据集生成的表适配器。如。

    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”

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