在申请中存储一段文字以供进一步使用

时间:2013-06-11 20:47:27

标签: c# sql-server winforms visual-studio-2012

我有一个业务Winforms应用程序,它大量使用对SQL Server上的数据库的访问。

所有数据库逻辑都已经以视图和存储过程的形式存在于数据库中。

然而,出现了特殊需求,我需要在winforms应用程序本身中嵌入10-20个查询,而不是存储过程。 对于小型查询,我只需使用" +"进行连接。将每一行都分配给一个字符串,该字符串将传递给要执行的SqlDataAdapter。 但对于有几十行的大型查询,这是不切实际的。

我想知道是否有一种方法来存储我的文件,我创建的查询命名为" qryPrivateMonthlyReport.sql"代码中的某个地方(资源可能是?),进一步读取并用于在SqlDataAdapter中执行。

提前致谢,

3 个答案:

答案 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.
    }
}

代码来自:http://software-security.sans.org/developer-how-to/fix-sql-injection-microsoft-.net-with-parameterized-queries

在这种情况下,我肯定会做的一件事是对XML进行加密,以便用户无法对其进行修改,但这取决于您。您可以查看此链接Encrypt and decrypt a string

答案 2 :(得分:1)

如果您需要将它们与代码一起存储,您可以将它们作为常量字符串文字放入数据访问类中(取决于您需要的灵活性级别)。

e.g。

        private const string GetAQuery =  @"select * from a
                                          where b = c";

调试时,你必须接受略微奇怪的缩进。您可以像Sako73所提到的那样将它们添加到资源中,但是这会增加一个间接级别,您必须根据您的特定情况来判断它是否值得。