编辑:从评论来看,我一直不清楚我想要实现的目标。我会从另一个角度尝试。
我一直在开发sprocs多年。我越来越觉得在嵌入C#代码的SQL和sprocs之间进行选择都是不好的选择。我知道很多人会不同意,这很好。 我在这个问题上没有详细说明这一点,以避免讨论是关于sprocs的:-)。
作为一项实验,我尝试在Visual Studio中的项目中嵌入.sql
个文件。从字面上看,在我的项目树中,我的文件扩展名为.sql
,Build Action
设置为Embedded Resource
。
这样我就可以在VS中编辑SQL查询代码,甚至可以在VS中运行/执行它,而无需运行项目。我喜欢那个。我现在正在处理的实际代码类似于"产品列表"具有分页和多个排序和过滤选项。 SQL查询具有@skip
,@search
等参数。这意味着如果我尝试从VS中运行/执行它(特别是通过按CTRL + SHIFT + e
或选择"执行& #34;来自VS中的" SQL"菜单)这些参数缺失(当然),因为它们应在运行时以SqlParameter
形式提供。我理解为什么这种情况发生,并且绝不意味着暗示VS或SSMS被窃听。我只是想找个方法来告诉" VS那个"当我从VS中执行此查询时,我打算让@skip
成为10
"。我(可能是错误的)认为VS具有IntelliSense支持和对.sql
文件的执行支持的原因是支持类似于我正在尝试的场景。
我只是希望其他人也这样做,并有一个聪明的方式/插件/技巧来支持它。
编辑结束
在Visual Studio 2017的一个项目中,我有许多.sql文件,这些文件在构建时嵌入到应用程序中。
在VS中编辑文件时,我可以方便地连接到SQL服务器并执行查询
但是,如果查询具有如下参数:
SELECT * FROM Employee WHERE ID=@ID;
在Visual Studio中执行失败并带有
Must declare the scalar variable "@ID".
这可以修复"通过在脚本/文件的顶部添加一行,所以它看起来像:
DECLARE @ID int = 123;
SELECT * FROM Employee WHERE ID=@ID;
然而,现在从这样的代码中调用时它不起作用(使用Dapper,它与问题无关,但解释了语法):
var emp = conn.Query<Employee>( sql, new { ID=123 } );
我希望我可以在文件中的某个地方指定ID的值,或者指定VS将执行的文件的某些部分,但是稍后在从代码调用时会被忽略。
编辑:为了清楚起见,我可以制作SQL,以便在运行时从Visual Studio 或中完美运行,但我不能同时使用它们。我希望有一些整洁的黑客,一个VS插件或只是一些我刚刚失踪的VS功能。我考虑添加一个简单的预处理器,所以我可以这样做:
--if DEBUG
DECLARE @ID int = 123;
--endif
SELECT * FROM Employee WHERE ID=@ID;
然后我可以将它添加到我加载嵌入资源的函数中。
答案 0 :(得分:1)
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT * FROM Employee WHERE ID=@ID;";
cmd.Parameters.Add("@ID", actualID); <--this is is why declaring doesn't work - You can declare it, but you also need to add it to the query
SqlDataReader rdr = cmd.ExecuteReader();