興味のある方のために、DataTableパラメータータイプを認識してサポートするようにSubSonic2.xコードを変更しました。
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には直接テーブルアクセスがなく、私のDBにはそのユーザーのsprocへの実行権限しかありません。そのため、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用に2つのフォルダー(CustomとGenerated)を用意するのは良い形式なので、Customで次のようなStoredProcedures.cs部分クラスを作成しました。
/// <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の人が自動生成を変更してsproc署名のTVPを認識することができるかどうか疑問に思っていますか?
SubSonic 3.xは構造化データ型をサポートしていますか?
また、多くの人がこのコードの使用に興味を持っていると確信しています。新しいコードはどこにアップロードできますか?
ありがとう。