我有一个 .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#项目中添加引用。我花了几个小时来搜索它并查看它,但一无所获。我简直无法相信没有其他人试图做过这么简单的事情。对我来说这看起来很自然,实现这样的功能对微软来说应该是小菜一碟,对吗?我在这里错过了什么吗?你会如何解决这个问题?
答案 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
另一个好处是存储过程的结果也是强类型的。