Для тех, кто заинтересован, теперь я изменил код 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 структурированные типы данных?
Кроме того, я уверен, что многим будет интересно использовать этот код, так где я могу загрузить новый код?
Спасибо.