当前位置:  开发笔记 > 编程语言 > 正文

你在哪里把SQL语句放在你的c#项目中?

如何解决《你在哪里把SQL语句放在你的c#项目中?》经验,为你挑选了2个好方法。

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

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

我知道一种标准方法是为每个目标数据库创建一个DAL,并具有要使用的DAL配置状态.我真的不想为每个数据库创建两个DAL类.如果我只是通过keyname引用了正确的查询并且具有正确的连接类型,那么似乎代码会更少.

那么,你们这样做吗?你怎么会或者你有没有解决这个问题?什么最适合你?

谢谢!



1> marc_s..:

嗯,有很多选择 - 所以它真的取决于你最迫切的需求是什么:-)

一种方法可能是在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;
}

您需要将"ConsoleApplication1"替换为sql语句文件所在的实际命名空间.您需要通过完全限定名称来引用它们.然后,您可以使用以下行加载SQL语句:

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

然而,这使得查询相当"静态",例如,您无法在运行时配置和更改它们 - 它们直接被编译为已编译的二进制位.但另一方面,在VS中,您可以在C#程序代码和SQL语句之间实现清晰的分离.

如果你需要能够在运行时调整和更改它们,我会将它们放入一个SQL表中,该表包含例如关键字和实际的SQL查询作为字段.然后,您可以根据需要检索它们并执行它们.由于它们位于数据库表中,您还可以随意更改,修复,修改它们 - 即使在运行时 - 也无需重新部署整个应用程序.


而不是namespacePart,使用this.GetType().名称空间用于当前,动态版本,而typeof(程序).Namespace用于静态.当然,当你把它作为静态放入Program类时.不要忘记,当您的SQL文件在SQL目录中时,请通过"SQL.StatementName.sql"引用它
我已经使用了这种方法,并且我喜欢它。与大多数人不同,我不同意能够在运行时即时更改代码,甚至是简单的SQL语句,因此,它是用程序集编译的事实对我来说是一个加号。
很高兴听到这种方法正在被其他人使用和欢迎!:-)我同意-有时将东西烤到您的编译位中是一个加号。

2> Andrey Shche..:

当我真的需要它时,我将查询放入单独的*.sql文件中,然后将它们包含在Resources.resx中.其中有一个"文件"部分,允许您包含嵌入式资源文件.

之后,我可以使用生成的Resources.MyQuery属性来保证资源的存在,并使我免于编写自定义资源加载方法.

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有