我可能会负责将vb6应用程序移植到c#.此应用程序是一个与访问数据库交互的Windows应用程序.数据访问封装在基本业务对象中.基本上一个表的一个类.现有的vb6业务对象通过DAO读写DB.我以前写了几次DAL和ORM,但它们都只针对SQL Server.这个将需要目标访问和SQL服务器.在以前的项目中,我会将SQL字符串放在业务对象的私有部分中,并可能将冗余的sql代码(如连接,创建命令)移动到公共基类中以减少代码.
这一次,我正在考虑将SQL字符串写入.settings文件或其他键/值类型文本文件.然后我会编写一个sql实用程序来编辑这个文件,并允许我运行并测试参数化查询.这些查询将在业务对象中按名称引用,而不是将sql嵌入到代码中.
我知道一种标准方法是为每个目标数据库创建一个DAL,并具有要使用的DAL配置状态.我真的不想为每个数据库创建两个DAL类.如果我只是通过keyname引用了正确的查询并且具有正确的连接类型,那么似乎代码会更少.
那么,你们这样做吗?你怎么会或者你有没有解决这个问题?什么最适合你?
谢谢!
嗯,有很多选择 - 所以它真的取决于你最迫切的需求是什么:-)
一种方法可能是在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查询作为字段.然后,您可以根据需要检索它们并执行它们.由于它们位于数据库表中,您还可以随意更改,修复,修改它们 - 即使在运行时 - 也无需重新部署整个应用程序.
渣
当我真的需要它时,我将查询放入单独的*.sql文件中,然后将它们包含在Resources.resx中.其中有一个"文件"部分,允许您包含嵌入式资源文件.
之后,我可以使用生成的Resources.MyQuery属性来保证资源的存在,并使我免于编写自定义资源加载方法.