10

我正在为一个客户端开发一个 Winforms C# 应用程序,它取代了他们旧的基于 MS Access 的解决方案。这是一个完整的重写,现在使用 SQL Server 作为其数据库。该软件现在处于开发的最后阶段。

他们刚刚要求的一件事是能够执行软件的 UI 当前可能不允许他们在需要时执行的自定义查询。

使用旧的 Access 解决方案,他们可以使用查询设计器创建自己的自定义查询。使用 winforms/Sql Server 解决方案,他们无法做到这一点。他们也不想自己编写 SQL。

谁能想到一个很好的解决这个问题的方法?也许是一个 Winforms 库,它允许用户创建业务对象图和“和|或”逻辑。或者其他一些允许他们自定义查询的 UI 类型,几乎就像他们在 Access 中可以做的一样(但可能更特定于域)。

更新

我已将 Yaqub 的答案标记为答案,因为这是最接近我当时正在寻找的答案。我最终为他们编写了一个自定义表单来生成他们的查询:

在此处输入图像描述

第二组中的“选择表...”组合框仅显示已添加到顶部列表框中的表。

因为数据库布局现在几乎是一成不变的,所以我编写了代码来智能地计算所需的任何连接。例如,如果他们在顶层组中添加两个间接相关的表,那么当它生成 SQL 时,它将添加任何必需的连接来关联这些表。如果数据库布局确实发生了变化,我可以很容易地在查询编辑器的代码中更改 FK 引用。

对于条件组,值控件(该组中的第 4 个控件)根据字段类型(文本框、数字上/下控件、日期选择器、复选框)而变化。

当他们单击“运行查询”时,他们会得到另一个带有显示结果的网格视图的表单。在该结果表单中,它们可以导出到制表符分隔的文件。

我已经给了他们第一个版本,到目前为止,他们似乎对此非常满意。

我不想走 Access 路线,因为这个新版本的软件的重点是将它们从 Access 中移开(嗯,不是重点,因为那里也有更多的功能)。保持对 Access 的依赖似乎是一个巨大的退步。这也意味着如果他们在 Access 中保存大量自定义查询,并且我曾经更改数据库架构,我很可能会破坏他们的查询。我不希望他们像那样访问数据库。在我看来,这是自找麻烦。唯一应该触及数据库的是新软件,以及我们所做的任何自动数据库备份——没有别的,尤其是用户!

在软件中执行此操作的另一个优点是我可以对查询结果进行后处理。例如,有相当多的数据分析算法在软件中运行,这些算法是用 .NET 代码编写的。所以我可以向这个界面添加字段,允许他们选择这些算法的结果。

4

4 回答 4

8

您可能会发现Visual SQL 查询设计器很有帮助。它将让您了解如何实现此功能。

此工具可用于设计 SQL 查询。与 SQL Server Management Studio 相比,它的 UI 非常基本。它的限制是它使用OLEDB连接字符串。您可以从这里下载源代码。

编辑:

EasyQuery.NET WinForms可以是一个选项,但它不是免费的。

这篇文章也可能对你有所帮助。

于 2013-01-29T16:12:32.423 回答
3

一个传统的“微软”对此的回答是让他们继续使用 Access……只将它指向 SQL 服务器,然后让他们在那里构建他们的自定义查询。

如果您想变得花哨,可以构建查询用户角色和帐户,仅授予对其的读取访问权限,甚至在必要时使用资源管理器将内置角色用户帐户限制为系统总负载的某个百分比.

在将 Access 中的新东西卷入实际代码之前,对它进行原型设计并不可耻。

于 2013-01-29T18:26:03.963 回答
3

您是否考虑过使用 SQL 的 SSRS 部分,并让他们访问 ReportBuilder 工具?它为高级用户提供了一个不错的界面。如果您在数据库中设置了主键和外键,它将识别这些关系并帮助用户构建多表查询。该工具可以直接从 SSRS 门户网站下载,您可以使用 ReportViewer 控件将报告直接集成到您的 .Net 应用程序中,或者您可以使用简单的 HTTP 请求将它们以 Excel、PDF 等格式拉回。

于 2013-02-01T17:04:04.563 回答
-2

我使用过类似的工具,基本上这个工具为业务用户提供了通过拖放业务视图在数据网格中创建报告。我们在表之上创建视图并维护元数据信息,如字段关系等元数据表。如果表具有参照完整性,则工具正在从 sql server 主数据库获取信息。

我们从 codeproject 上提供的这个实用程序中获得了帮助。您可以浏览这个通过拖放创建 sql 查询的基本应用程序,您可以根据需要进行更改。

http://www.codeproject.com/Articles/43171/A-Visual-SQL-Query-Designer

于 2013-02-05T09:59:50.120 回答