【问题标题】:SubSonic 2.x now supports TVP's - SqlDbType.Structure / DataTables for SQL Server 2008SubSonic 2.x 现在支持 TVP - SQL Server 2008 的 SqlDbType.Structure / DataTables
【发布时间】:2010-06-08 17:07:57
【问题描述】:

对于那些感兴趣的人,我现在修改了 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 没有直接的表访问权限,我的数据库只有该用户对我的存储过程的执行权限。因此,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 提供两个文件夹(自定义和生成)是一种很好的形式,因此我在自定义中创建了一个 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 的家伙是否可以修改 auto-gen 以识别 sproc 签名中的 TVP,以避免重新编写包装器?

SubSonic 3.x 是否支持结构化数据类型?

另外,我相信很多人都会对使用此代码感兴趣,那么我在哪里可以上传新代码?

谢谢。

【问题讨论】:

  • 这里有问题吗?
  • @Sean:实际上有几个问题。它们是针对 SubSonic 维护者的,但它们是有效的问题。
  • 帖子确实包含一些问题。然而,以目前的形式,这似乎更像是针对少数特定收件人的补丁/功能提交,而不是对典型的 Stack Overflow 读者有用的通用问题。我想这对我来说并不是真的“感觉”是一个常见的 Stack Overflow 问题。是否有办法重写或重新组织此提交,使其更接近网站的正常主题?
  • @Sean:主要问题是亚音速放弃了它的论坛并派人到这里。当然,这篇文章在 codeproject 上可能会更好。
  • @ElHaix:您介意分享您对 QueryCommand.cs 所做的更改以及您必须修改以支持表值参数的任何其他类吗?

标签: sql-server-2008 subsonic datatable structured-data


【解决方案1】:

我已经发布了一个包含整个解决方案、源代码和说明的 CodePlex 项目。

项目可以在here找到。

【讨论】:

  • 更新了 CodePlex 上的代码 - 添加了对 SOAP 对象引用的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多