我有一个业务Winforms应用程序,它大量使用对SQL Server上的数据库的访问。
所有数据库逻辑都已经以视图和存储过程的形式存在于数据库中。
然而,出现了特殊需求,我需要在winforms应用程序本身中嵌入10-20个查询,而不是存储过程。 对于小型查询,我只需使用" +"进行连接。将每一行都分配给一个字符串,该字符串将传递给要执行的SqlDataAdapter。 但对于有几十行的大型查询,这是不切实际的。
我想知道是否有一种方法来存储我的文件,我创建的查询命名为" qryPrivateMonthlyReport.sql"代码中的某个地方(资源可能是?),进一步读取并用于在SqlDataAdapter中执行。
提前致谢,
答案 0 :(得分:2)
我将它们添加为资源。它允许我用简单的Properties.Resources.MyFileResourceNameHere
引用文件的文本。这是我在Visual Studio项目中嵌入较大查询时发现的最干净的解决方案。
另外,当我嵌入它们时,而不是使用“+”运算符,我使用文字字符串@“这里的多行查询”;它不需要行之间的“+”。
编辑: 下面的一些评论提到了将SQL保存在单独的资源文件中所涉及的额外间接,我同意。我的经验法则是:
如果它是1-liner,我将它保持为常规字符串常量。
如果是多行语句,我使用文字字符串常量(即 @""
),这样我就可以保持换行符,缩进,并没有很多 " +
。
如果它太大而我需要SQL语法突出显示(例如SQL Management Studio或Visual Studio),我将其设为资源文件,因此我可以独立于.NET代码编辑和测试该文件。
答案 1 :(得分:2)
选项1
看一下dapper-dot-net,它是一个微型ORM,允许您将查询转换为对象。您可以将它们放在数据访问层中,如果您需要在实体框架之后使用完整的ORM,则可以轻松移动它。
http://code.google.com/p/dapper-dot-net/
Rob Connery https://github.com/robconery/massive
也有很多如果您正在运行更大的查询,这可能表明您需要完整的ORM。
选项2
使用参数化查询。您可以编写SQL来获取参数。您可以存储.sql文件,也可以使用包含查询的xml文件。您的查询将包含参数:
我想你的xml会是这样的:
<?xml version="1.0" encoding="UTF-8" ?>
<sql-queries>
<statement>
<id>get-id</id>
<sql>SELECT UserId FROM User WHERE UserName = @UserName AND Password = @Password;</sql>
</statement>
</sql-queries>
加载查询后(通过阅读文本或读取XML文件)。您可以使用参数执行。
using (SqlCommand cmd = new SqlCommand(sql))
{
// Create the parameter objects as specific as possible.
cmd.Parameters.Add("@UserName", System.Data.SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@Password", System.Data.SqlDbType.NVarChar, 25);
// Add the parameter values. Validation should have already happened.
cmd.Parameters["@UserName"].Value = UserName;
cmd.Parameters["@Password"].Value = Password;
cmd.Connection = connnection;
try
{
cmd.Connection.Open();
var userId = cmd.ExecuteScalar();
}
catch (SqlException sx)
{
// Handle exceptions before moving on.
}
}
在这种情况下,我肯定会做的一件事是对XML进行加密,以便用户无法对其进行修改,但这取决于您。您可以查看此链接Encrypt and decrypt a string
答案 2 :(得分:1)
如果您需要将它们与代码一起存储,您可以将它们作为常量字符串文字放入数据访问类中(取决于您需要的灵活性级别)。
e.g。
private const string GetAQuery = @"select * from a
where b = c";
调试时,你必须接受略微奇怪的缩进。您可以像Sako73所提到的那样将它们添加到资源中,但是这会增加一个间接级别,您必须根据您的特定情况来判断它是否值得。