我正在开发一个C#控制台应用程序,它运行两个SQL查询,这些查询以字符串形式传递,如下所示
private DataTable GetData(string resultsQuery) {
SqlCommand sqlCmd = new SqlCommand(resultsQuery, sqlcon);
DataTable dtlist = new DataTable();
SqlDataAdapter dalist = new SqlDataAdapter();
dalist.SelectCommand = sqlCmd;
dalist.Fill(dtlist);
sqlcon.Close();
return dtlist;
}
但问题是这些查询经常变化并且每次更改时,我都会在安装更新的应用程序之前重新构建,重新发布和卸载旧应用程序,我认为这是一种不好的做法。我无法使用存储过程的原因是我只有对数据库的读访问权,而且我无法创建存储过程。
任何人都可以建议我采用更好的方法和最佳做法来解决这个问题吗?
答案 0 :(得分:2)
基本上,您的查询是程序配置的一部分,该配置目前是硬编码的。因此,您需要的解决方案与访问数据库几乎没有关系:您需要一种方法来升级已安装应用程序的配置设置。
虽然拥有存储过程是一个不错的选择,但还有其他方法可以实现您正在寻找的效果:
一种方法是配置您具有写访问权限的单独数据库,并将其用作查询字符串的来源。创建一个“映射”查询名称以查询内容的表:
QueryKey Query
-------- --------------------------------------
query1 SELECT A, B, C FROM MyTable1 WHERE ...
queryX SELECT X, Y, Z FROM MyTable2 WHERE ...
您的程序可以在启动时读取此其他数据库,并存储查询以便在运行时使用。当最终用户请求他们的数据时,您的程序将执行从配置数据库到您的只读数据库的查询。
您可以采用其他方法来分发此配置。替代方案包括将字符串存储在应用程序可见的文件服务器上的共享文件夹中,设置自己的网络服务以在启动时为应用程序提供查询,或使用内置的配置方法。净。最后一种方法要求您逐个更改单个计算机上的设置,这可能不是理想的部署方案。
答案 1 :(得分:0)
提到了使用外部XML文件的想法,但因为这是.Net,这正是App.Config文件的设计目的。有一个完整的类库,允许您在App.Config文件中存储信息,因此可以轻松修改它,而无需重新编译程序。最重要的警告是,如果查询返回一个完全不同的形状结果集,这将无济于事。但是,如果您要更改的是WHERE条件或类似的东西,而不是SELECT列表;那么这种方法就可以了。