在c#项目中将SQL语句放在哪里?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我可能会负责将VB6应用程序移植到c#。此应用程序是一个与Access db交互的Windows应用程序。数据访问封装在基本业务对象中。现有的VB6业务对象通过DAO读写数据库。我以前写过DALS和ORM几次,但它们都只针对SQLServer。这将需要目标访问和SQL服务器。在以前的项目中,我会将SQL字符串放在业务对象的私有部分中,并可能将冗余的SQL代码(例如连接、创建命令)移动到一个公共基类中,以减少代码。

这一次,我正在考虑将SQL字符串写入.set文件或其他键/值类型的文本文件中。然后编写一个SQL实用程序来编辑这个文件,并允许我运行和测试参数化查询。这些查询将被业务对象中的名称引用,而不是将SQL嵌入到代码中。

我知道一种标准方法是为每个目标数据库创建DAL,并具有DAL要使用的配置状态。

提问于
用户回答回答于

一种方法可能是在VS解决方案中将SQL语句创建为文本文件,并在“构建操作”中将它们标记为“嵌入式资源”。这样,SQL就包含在生成的程序集中,并且可以在运行时使用.NET框架的ResourceManifestStream从它检索:

private string LoadSQLStatement(string statementName)
{
    string sqlStatement = string.Empty;

    string namespacePart = "ConsoleApplication1";
    string resourceName = namespacePart + "." + statementName;

    using(Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
    {
        if (stm != null)
        {
            sqlStatement = new StreamReader(stm).ReadToEnd();
        }
    }

    return sqlStatement;
}

您需要将“ConsoleApplication 1”替换为实际的名称空间,其中驻留SQL语句文件。您需要使用完全限定的名称来引用它们。然后,可以用以下行加载SQL语句:

string mySQLStatement = LoadSQLStatement("MySQLStatement.sql");

用户回答回答于

我会把这些查询变成单独的。*.sql文件,然后将它们包含到Resources.resx中。其中有一个“文件”部分,允许您包含嵌入式资源文件。

之后,我可以使用GeneratedResources.MyQuery属性,它既保证了资源的存在,又避免了编写自定义资源加载方法。

扫码关注云+社区