SubSonic 2.x теперь поддерживает TVP - SqlDbType.Structure / DataTables для SQL Server 2008.

Для тех, кто заинтересован, я изменил код SubSonic 2.x для распознавания и поддержки типов параметров DataTable.

Вы можете узнать больше о функциях SQL Server 2008 здесь: http://download.microsoft.com/download/4/9/0/4906f81b-eb1a-49c3-bb05-ff3bcbb5d5ae/SQL%20SERVER%202008-RDBMS/T-SQL%20Enhancements%20with%20SQL%20Server%202008%20-%20Praveen%20Srivatsav.pdf

Теперь это усовершенствование позволит вам создать частичный класс StoredProcedures.cs с методом, который переопределяет метод-оболочку хранимой процедуры.

Немного о хорошей форме: мой DAL не имеет прямого доступа к таблице, а моя БД имеет только права на выполнение для этого пользователя в моих sprocs. Таким образом, SubSonic генерирует только классы AllStructs и StoredProcedures.

SPROC:

    ALTER PROCEDURE [dbo].[testInsertToTestTVP]
    @UserDetails TestTVP READONLY,
    @Result INT OUT
AS
BEGIN
    SET NOCOUNT ON;

    SET @Result = -1

    --SET IDENTITY_INSERT [dbo].[tbl_TestTVP] ON

    INSERT INTO [dbo].[tbl_TestTVP]
            ( [GroupInsertID], [FirstName], [LastName] )
    SELECT [GroupInsertID], [FirstName], [LastName]
    FROM @UserDetails

    IF @@ROWCOUNT > 0
        BEGIN
            SET @Result = 1
            SELECT @Result
            RETURN @Result
        END
    --SET IDENTITY_INSERT [dbo].[tbl_TestTVP] OFF

END

TVP:

    CREATE TYPE [dbo].[TestTVP] AS TABLE(
    [GroupInsertID] [varchar](50) NOT NULL,
    [FirstName] [varchar](50) NOT NULL,
    [LastName] [varchar](50) NOT NULL
)
GO

Инструмент автогенерации запускается, он создает следующий ошибочный метод:

    /// <summary>
    /// Creates an object wrapper for the testInsertToTestTVP Procedure
    /// </summary>
    public static StoredProcedure TestInsertToTestTVP(string UserDetails, int? Result)
    {
        SubSonic.StoredProcedure sp = new SubSonic.StoredProcedure("testInsertToTestTVP", DataService.GetInstance("MyDAL"), "dbo");     
        sp.Command.AddParameter("@UserDetails", UserDetails, DbType.AnsiString, null, null);
        sp.Command.AddOutputParameter("@Result", DbType.Int32, 0, 10);            
        return sp;
    }

Он устанавливает UserDetails как строку типа.

Так как иметь две папки для SubSonic DAL - Custom и Generated - это хороший вариант, я создал частичный класс StoredProcedures.cs в Custom, который выглядит следующим образом:

    /// <summary>
    /// Creates an object wrapper for the testInsertToTestTVP Procedure
    /// </summary>
    public static StoredProcedure TestInsertToTestTVP(DataTable dt, int? Result)
    {
        SubSonic.StoredProcedure sp = new SubSonic.StoredProcedure("testInsertToTestTVP", 
                                                                    DataService.GetInstance("MyDAL"), 
                                                                    "dbo");

        // TODO: Modify the SubSonic code base in sp.Command.AddParameter to accept
        //       a parameter type of System.Data.SqlDbType.Structured, as it currently only accepts
        //       System.Data.DbType.
        //sp.Command.AddParameter("@UserDetails", dt, System.Data.SqlDbType.Structured null, null);

        sp.Command.AddParameter("@UserDetails", dt, SqlDbType.Structured);
        sp.Command.AddOutputParameter("@Result", DbType.Int32, 0, 10);

        return sp;
    }

Как видите, подпись метода теперь содержит DataTable, и с моей модификацией фреймворка SubSonic это теперь работает отлично.

Мне интересно, могут ли ребята из SubSonic изменить автогенерацию для распознавания TVP в подписи sproc, чтобы избежать необходимости переписывать оболочку?

Поддерживает ли SubSonic 3.x структурированные типы данных?

Кроме того, я уверен, что многим будет интересно использовать этот код, так где же я могу загрузить новый код?

Спасибо.


person ElHaix    schedule 08.06.2010    source источник
comment
Есть ли здесь где-нибудь вопрос?   -  person Sean Reilly    schedule 08.06.2010
comment
@Sean: на самом деле несколько вопросов. Они адресованы специалистам по сопровождению SubSonic, но это правильные вопросы.   -  person Remus Rusanu    schedule 08.06.2010
comment
Это правда, что в посте действительно есть вопросы. Однако в его текущей форме это больше похоже на отправку патча / функции, направленную на небольшое количество конкретных получателей, а не на вопрос общего назначения, который был бы полезен для типичного читателя Stack Overflow. Думаю, мне это не кажется обычным вопросом о переполнении стека. Возможно, есть способ переписать или реорганизовать это представление, чтобы оно было ближе к обычной теме сайта?   -  person Sean Reilly    schedule 09.06.2010
comment
@Sean: главная проблема в том, что subsonic забросил свой форум и отправил сюда людей. Этот пост, конечно, может быть лучше на codeproject.   -  person P a u l    schedule 15.06.2010
comment
@ElHaix: Не возражаете ли вы поделиться изменениями, внесенными в QueryCommand.cs и любыми другими классами, которые вам пришлось изменить для поддержки параметров с табличным значением?   -  person Joel Clark    schedule 13.07.2011
comment
@Joel: Я отправлю вам ссылку в эти выходные, как только код найдет дом.   -  person ElHaix    schedule 14.07.2011
comment
@ElHaix: Ваш код когда-нибудь нашел дом? Я хотел бы взглянуть на вашу работу по этой теме.   -  person Joel Clark    schedule 04.08.2011
comment
@Joe: Проект CodePlex и документация находятся здесь: subsonic23tvp.codeplex.com.   -  person ElHaix    schedule 05.09.2011


Ответы (1)


Я разместил проект CodePlex со всем решением, исходным кодом и инструкциями.

Проект можно найти здесь.

person Community    schedule 05.09.2011
comment
Обновлен код на CodePlex - добавлена ​​поддержка ссылок на объекты SOAP. - person ElHaix; 26.10.2011