Subsonic 3.0.0.3不为存储过程生成参数

时间:2009-08-28 20:34:32

标签: stored-procedures subsonic templates subsonic3

我有一个带有一堆存储过程的SQL Server 2008数据库。当我使用Subsonic 3.0.0.3提供的ActiveRecord模板时,它会为我的所有存储过程生成方法,但它们没有任何参数。我是服务器上的dbo,可以执行存储过程而没有来自Management studio的问题。

存储过程示例

CREATE PROCEDURE [dbo].[prc_Sample]
    @FileName   VARCHAR(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF EXISTS ( SELECT * FROM Sample WHERE FileName = @FileName )
    BEGIN
        RETURN -1
    END

    RETURN 0

END

示例生成方法

public StoredProcedure prc_Sample(){
    StoredProcedure sp=new StoredProcedure("prc_Sample",this.Provider);
    return sp;
}

如果我检查SQLServer.ttinclude,我可以看到获取存储过程的所有方法都存在,但由于某种原因它们没有生成。这不是存储过程名称中有下划线的问题 - 无论有没有下划线都会破坏。

任何想法或任何人都知道如何调试模板文件?

4 个答案:

答案 0 :(得分:13)

我遇到了同样的问题,我不得不调整SQLServer.ttinclude以使其正常运行。在该文件中找到GetSPParams()方法并更改一行:

来自

string[] restrictions = new string[4] { DatabaseName, null, spName, null };

string[] restrictions = new string[3] { null, null, spName };

BlackMael的答案有一个有用的链接,帮助我弄清楚如何调试和逐步完成模板代码。

现在我还不能100%确定我的改变是好的(可能会有一些不利影响)。我只是没有机会彻底测试它,需要在Restrictions上阅读更多内容,因为它们与GetSchema()方法有关。但是现在,这解决了我的问题,我可以成功传入我的存储过程参数。

更新:这可能与我的数据库文件嵌入App_Data中的VS解决方案这一事实有关。也许这对于独立的SQL Server实例来说可以更好地开箱即用。

答案 1 :(得分:1)

调试T4模板文件......

T4 Tutorial: Debugging Code Generation Files

使用SubSonic-30-Templates中指向SqlExpress中Northwind实例的项目,我添加了上面的存储过程。重新生成了StoredProcedures.tt并且很高兴地创建了......

public StoredProcedure prc_Sample(string FileName){
    StoredProcedure sp=new StoredProcedure("prc_Sample",this.Provider);
    sp.Command.AddParameter("FileName",FileName,DbType.AnsiString);
    return sp;
}

虽然我使用了最新且最好的版本,但我没有注意到参数丢失的问题。

您可以发布 Settings.ttinclude 以及可能 SqlServer.ttinclude 文件吗?或者也许是他们的链接? StoredProcedures.tt 也可能不错。

答案 2 :(得分:0)

与Kon M的答案类似,我将SQLServer.tt中的行更改为:

string[] restrictions = new string[4] { null, null, spName, null };

这解决了我的问题。

答案 3 :(得分:0)

另一个可能的原因是数据库没有分配dbo。