我有一个带有一堆存储过程的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,我可以看到获取存储过程的所有方法都存在,但由于某种原因它们没有生成。这不是存储过程名称中有下划线的问题 - 无论有没有下划线都会破坏。
任何想法或任何人都知道如何调试模板文件?
答案 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。