我可能会负责将vb6应用程序移植到c#。该应用程序是一个与访问数据库交互的Windows应用程序。数据访问封装在基本业务对象中。一桌一桌基本上。现有的vb6业务对象通过DAO读写数据库。我之前写过几次DAL和ORM,但它们都只针对SQL Server。这将需要目标访问和sql server。在以前的项目中,我将把SQL字符串放在业务对象的私有部分中,并可能将多余的sql代码(如连接,创建命令)移到一个通用的基类中以减少代码。
这次,我正在考虑将SQL字符串写入.settings文件或其他一些键/值类型文本文件中。然后,我将编写一个sql实用程序来编辑此文件,并允许我运行和测试参数化查询。这些查询将在业务对象中按名称引用,而不是将sql嵌入代码中。
我知道一种标准方法是为每个目标数据库创建一个DAL,并具有要使用的DAL的配置状态。我真的不想为每个数据库创建两个DAL类。如果我只是通过键名引用正确的查询并具有正确的连接类型,则似乎代码会更少。
那么,你们在做这样的事情吗?您将如何解决这个问题?什么最适合您?
谢谢!
好吧,这里有很多选择-因此,这实际上取决于您最紧迫的需求是什么:-)
一种方法可能是在VS解决方案中将SQL语句创建为文本文件,然后在“构建操作”中将它们标记为“嵌入式资源”。这样,SQL将包含在结果程序集中,并且可以使用.NET框架的ResourceManifestStream在运行时从中检索该SQL:
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; }
您需要用sql语句文件所在的实际名称空间替换“ ConsoleApplication1”。您需要使用完全限定的名称来引用它们。然后,您可以使用以下行加载您的SQL语句:
string mySQLStatement = LoadSQLStatement("MySQLStatement.sql");
但是,这会使查询变得“静态”,例如,您无法在运行时配置和更改查询- 它们直接烘焙到已编译的二进制位中。但另一方面,在VS中,您的C#程序代码和SQL语句之间有一个很好的清晰分隔。
如果您需要能够在运行时进行调整和更改,则可以将它们放在单个SQL表中,该表包含例如关键字和实际的SQL查询作为字段。然后,您可以根据需要检索它们并执行它们。由于它们位于数据库表中,因此您甚至可以在运行时随意更改,修复或修改它们,而不必重新部署整个应用程序。
马克