传递SQL查询而不是存储过程的最佳方式

本文关键字:存储过程 最佳 方式 SQL 查询 传递 | 更新日期: 2023-09-27 18:07:16

我正在研究一个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;
}

,但事情是这些查询不断变化非常频繁,每次他们改变,我重新构建,重新发布和卸载旧的应用程序之前安装更新的应用程序,我认为这是一个不好的做法。我不能使用存储过程的原因是我只有对数据库的读访问权限,而且我不能创建存储过程。

谁能建议我一个更好的方法和最佳实践来处理这个?

传递SQL查询而不是存储过程的最佳方式

本质上,您的查询是程序配置的一部分,目前是硬编码的。因此,您需要的解决方案与访问数据库几乎没有关系:您需要一种方法来升级已安装应用程序的配置设置。

虽然使用存储过程是一个不错的选择,但是还有其他方法可以达到您想要的效果:

一种方法是配置一个您有写访问权限的单独数据库,并将其用作查询字符串的源。创建一个表,将查询名称"映射"到查询内容:

QueryKey Query
-------- --------------------------------------
query1   SELECT A, B, C FROM MyTable1 WHERE ...
queryX   SELECT X, Y, Z FROM MyTable2 WHERE ...

你的程序可以在启动时读取其他数据库,并存储查询以便在运行时使用。当终端用户请求他们的数据时,您的程序将执行它从配置数据库获得的对只读数据库的查询。

您可以采用其他方法来分发此配置。其他选择包括将字符串存储在应用程序可见的文件服务器上的共享文件夹中,设置自己的网络服务以在启动时为应用程序提供查询,或者使用。net中可用的内置配置方法。最后一种方法需要您逐个更改各个机器上的设置,这可能不是理想的转出场景。

提到了使用外部XML文件的想法,但因为这是。net,所以这正是App.Config文件的设计目的。有一个完整的类库,允许你在App.Config文件中存储信息,这样它就可以很容易地修改,而无需重新编译程序。需要注意的是,如果查询返回的是一个形状完全不同的结果集,那么这不会有太大帮助。但如果你改变的只是WHERE条件或类似的东西,而不是SELECT列表;