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

Best way to pass a SQL query other than a stored procedure

我正在开发一个 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;
}

但问题是这些查询不断变化,每次变化时,我都会重新构建、重新发布和卸载旧应用程序,然后再安装更新的应用程序,我认为这是一种不好的做法。我不能使用存储过程的原因是我只有对数据库的读取权限,我不能创建存储过程。

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

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

虽然存储过程是一个不错的选择,但还有其他方法可以达到您正在寻找的效果:

一种方法是配置一个单独的数据库,您对其具有写入权限,并将其用作查询字符串的来源。做一个table那个"maps"查询名字来查询内容:

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

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

您可以采用其他方法来分发此配置。替代方案包括将字符串存储在您的应用程序对其可见的文件服务器上的共享文件夹中,设置您自己的网络服务以在启动时为您的应用程序提供查询,或使用 .网。最后一种方法需要您一台一台地更改各个机器上的设置,这可能不是理想的部署方案。

有人提到了使用外部 XML 文件的想法,但因为这是 .Net,所以这正是 App.Config 文件的设计目的。有一个完整的 class 库旨在允许您将信息存储在 App.Config 文件中,因此无需重新编译程序即可轻松修改它。最大的警告是,如果查询 returns 一个完全不同形状的结果集,这将无济于事。但是,如果您要更改的只是 WHERE 条件或类似条件,而不是 SELECT 列表;那么这种方法就可以正常工作。