0

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

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

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

我想知道是否有一种方法可以存储我的文件,我在代码中的某处创建名为“qryPrivateMonthlyReport.sql”的查询(资源可能是?),以进一步读取和使用以在 SqlDataAdapter 中执行。

提前致谢,

4

3 回答 3

2

我将它们添加为资源。它允许我使用简单的Properties.Resources.MyFileResourceNameHere. 这是我找到的在 Visual Studio 项目中嵌入较大查询的最简洁的解决方案。

此外,当我嵌入它们时,我不使用“+”运算符,而是使用文字字符串@“multi-line query here”;,它不需要行之间的“+”。

编辑:下面的一些评论提到了将 SQL 保存在单独的资源文件中所涉及的额外间接性,我同意。我的经验法则是:

  • 如果它是 1-liner,我将其保留为常规字符串常量。

  • 如果是多行语句,我使用文字字符串常量(即@""),这样我就可以保留换行符、缩进,并且没有很多" +.

  • 如果它太大以至于我需要 SQL 语法高亮显示(例如 SQL Management Studio 或 Visual Studio),我会将其设为资源文件,这样我就可以独立于 .NET 代码来编辑和测试文件。

于 2013-06-11T20:55:31.237 回答
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,这样用户就无法修改它,但这取决于你。您可以在这样做时查看此链接加密和解密字符串

于 2013-06-11T21:50:21.057 回答
1

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

例如

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

调试时,您必须接受稍微奇怪的缩进。您可以将它们添加到 Sako73 提到的资源中,但这会增加一定程度的间接性,您必须根据您的特定情况判断它是否值得。

于 2013-06-11T21:07:15.587 回答