如果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属性”。被抛出
答案 0 :(得分:1)
答案 1 :(得分: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”
很想看到比这更“清洁”的答案!