Может ли ObjectDataSource использовать табличные параметры - PullRequest
0 голосов
/ 15 октября 2010

Если веб-страница 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>

Я пытался подключиться к событию Selecting объекта 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 ]

1 голос
/ 15 октября 2010

Я не знаю, почему вы хотите сделать это таким образом. Посмотрите это сообщение в блоге Ленни Лобель и посмотрите, работает ли это для вас.

* ОБНОВЛЕНИЕ: * Для отчетности я использую эту технику, как показано на Codebetter.com

0 голосов
/ 15 октября 2010

Для полноты картины это возможное решение (хотя, вероятно, оно попадает в категорию "ужасных"!)

Переопределить адаптер таблицы, созданный строго типизированным набором данных. например.

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 );
        }
    }
}

Затем обновите атрибут Type в элементе управления ObjectDataSource для ссылки на этот новый класс. например. "MyProject.GeneralDataSetTableAdapters.GeneralViewTableAdapter2"

Хотелось бы увидеть более «чистый» ответ, чем этот!

...