为Visual Studio SQL项目生成const

时间:2014-05-23 09:08:50

标签: c# sql sql-server visual-studio project

我有一个 .NET Web应用程序,使用 C# SQL Server 作为数据库部分。最近我发现了" SQL Server数据库项目"在VisualStudio中将我的SQL架构添加到我的CVS中。很有帮助!此外,如果我在存储过程中犯了一些错误,例如,解决方案不会构建,这很棒。

现在,我的问题。我的数据库中有几十个存储过程。在C#部分中,我将类存储过程调用分组,其中我写了类似于ExecuteQuery("spMyStoredProcedure", SqlParamenter[]...)的内容。如您所见,我对存储过程名称进行了硬编码。更好的选择是创建如下的常量:

private static const string SP_MY_STORED_PROCEDURE = "spMyStoredProcedure";

但由于我只使用一次存储过程,它几乎与硬编码相同。真正好的是从SQL Server Project生成这些常量(存储过程名称,参数,表名,列等)。实际上,如果它自动生成代码,调用C#方法等存储过程会更好,但常量对我来说已经足够了:)。如果我可以在我的SQL-Server-Project中重命名存储过程,那么可以正确地更改我的C#代码,或者如果我从存储过程中删除参数,则在SP调用中显示构建错误。

我知道,在Visual Studio中,SQL项目会生成一个DLL文件,但如果我检查它是空的,那么我就不能在C#项目中添加引用。我花了几个小时来搜索它并查看它,但一无所获。我简直无法相信没有其他人试图做过这么简单的事情。对我来说这看起来很自然,实现这样的功能对微软来说应该是小菜一碟,对吗?我在这里错过了什么吗?你会如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您可以使用可以为我们生成代码的令人兴奋的T4文件来完成此操作!

您可以设置一个.tt文件,该文件可以在保存存储过程的文件夹中进行搜索,提取文件列表,从文件名中删除.sql扩展名,然后重复执行此操作列表生成常量变量。光滑!

因此,在您的解决方案中的一个c#项目中(最好是数据库一,如果您有分层应用程序架构)添加一个 StoredProceduresNames.tt 文件,其中包含以下T4代码:

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".generated.cs" #>
<#@ import namespace="System.IO" #>
namespace MyProject.Constants {

    /// <summary>
    /// Contains the names of the stored procedures of the application
    /// </summary>
    public static class StoredProceduresNames 
    {
<# 
    string storedProceduresFolder = "Stored Procedures"; //set the path to sp folder here...
    string[] fileArray = Directory.GetFiles(Host.ResolvePath(storedProceduresFolder));
    foreach(var filePath in fileArray){
        string spName = Path.GetFileName(filePath).ToUpper().Replace(".SQL", "");       
#>
        public const string <#= spName #> = "<#= spName #>";
<#
        }
 #>
    }
}

您可能希望将变量storedProceduresFolder设置为相对于.tt文件(我的意思是,如果.tt文件位于ac#项目中并且您的存储过程位于数据库项目中,则路径应该类似于../MyProject.Database/Stored Procedures

然后,您可以在代码中使用生成的文件:

ExecuteQuery(MyProject.StoredProceduresNames.MY_STORED_PROCEDURE, SqlParamenter[]...)

随意根据需要调整此代码(代码约定,注释等)

更新:考虑使用Entity Framework进行代码生成

您还可以尝试让Entity Framework为您生成代码,不仅适用于表,还适用于调用存储过程。查看this article了解更多信息,使用Entity Framework,您可以通过以下方式调用存储过程:

MyEntities context = new MyEntities();
context.CallMyStoredProcedure(123, "West");//call to stored procedure

另一个好处是存储过程的结果也是强类型的。