【问题标题】:Subsonic 3.0.0.3 not generating parameters for stored proceduresSubsonic 3.0.0.3 不为存储过程生成参数
【发布时间】:2010-11-23 20:48:53
【问题描述】:

我有一个带有一堆存储过程的 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,我可以看到获取存储过程的所有方法都在那里,但由于某种原因它们没有生成。这不是存储过程名称中包含下划线的问题 - 这在有和没有下划线的情况下都会被打破。

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

【问题讨论】:

  • 我也有同样的问题。我绝对可以看到 .tt 文件的代码,该文件应该循环通过我的存储过程的参数,但最终生成的 .cs 没有添加该参数的代码。绝对需要解决这个问题。
  • 迈克,我删除了我的答案(所以这将显示为 0 个答案,希望有人能够弄清楚。我的答案和我们的挖掘并没有导致任何解决方案。谢谢

标签: stored-procedures subsonic templates subsonic3


【解决方案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】:

    我遇到了同样的问题,我必须调整 SQLServer.ttinclude 才能使其正常工作。在该文件中找到GetSPParams() 方法并更改一行:

    来自

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

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

    .

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

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

    更新:这可能与我的数据库文件嵌入在 App_Data 中的 VS 解决方案中这一事实有关。开箱即用的独立 SQL Server 实例可能效果更好。

    【讨论】:

    • 这行得通。我的数据库不是嵌入式的,只是托管在 SQL Server 2008 Standard Edition Server 上。使用 Subsonic 3,我让它为除这个特定数据库之外的所有其他数据库生成存储过程。我什至尝试从头开始创建它作为 2008 数据库,但它仍然导致了这个问题。再次感谢您的修复。
    【解决方案3】:

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

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

    这为我解决了问题。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多