我可能会负责将vb6应用程序移植到c#。此应用程序是与访问数据库进行交互的Windows应用程序。数据访问封装在基本业务对象中。一张桌子基本上是一张桌子。现有的vb6业务对象通过DAO读写DB。之前我已经写了DAL和ORM,但是他们都只针对sql Server。这将需要目标访问和sql服务器。在以前的项目中,我将sql字符串放置在业务对象的私有部分中,也可以将冗余的sql代码移动到连接,创建命令到一个公共的基类中以减少代码。
这一次,我正在考虑将sql字符串写入.settings文件或其他一些键/值类型的文本文件。然后,我将编写一个sql实用程序来编辑此文件,并允许我运行和测试参数化查询。这些查询将由业务对象中的名称引用,而不是将sql嵌入到代码中。
我知道一个标准的方法是为每个目标数据库创建一个DAL,并使配置状态使用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; }
您需要将“ConsoleApplication1”替换为sql语句文件所在的实际命名空间。您需要通过完全限定名称来引用它们。然后可以使用以下行加载sql语句:
string MysqLStatement = LoadsqlStatement("MysqLStatement.sql");
然而,这使得查询是“静态的”,例如。您不能在运行时配置和更改它们 – 它们被正确地烘烤到编译的二进制位中。但另一方面,在VS中,您可以在C#程序代码和sql语句之间清理干净。
如果您需要在运行时可以调整和更改它们,我将它们放在一个单独的sql表中,其中包含例如一个关键字和实际的SQL查询作为字段。然后,您可以根据需要检索它们,然后执行它们。由于它们位于数据库表中,您还可以随意更改,修复或修改它们,即使在运行时也不需要重新部署整个应用程序。
渣子