winforms 应用程序中的查询设计器

Posted

技术标签:

【中文标题】winforms 应用程序中的查询设计器【英文标题】:Query designer in winforms app 【发布时间】:2013-01-10 21:03:02 【问题描述】:

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

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

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

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

更新

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

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

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

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

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

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

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

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

【问题讨论】:

人们已经提供了很多(并且足够)解决方案:SQL Server Reporting Services(来自 Ben)或链接到 SQL Server 表的 Access 数据库(来自 Mark) @mvaraujo 这是关于我缺乏回应的评论吗?我还没有回复,因为我想在它工作后给出详细的更新。我决定编写一个专门为软件的业务对象设计的自定义查询编辑器。别担心 - 我没有忘记回复。 @Dan,是的,我愿意提请注意所提供的解决方案。很抱歉给您带来不便,我们当然会等待您对最终解决方案的报告。 【参考方案1】:

您可能会发现Visual SQL Query Designer 很有帮助。它会让您了解如何实现此功能。

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

编辑:

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

This article 也可能对您有所帮助。

【讨论】:

还有这个工具componentone.com/SuperProducts/Query(我不知道它有什么价值)。它似乎是 COM,而不是 .NET,但它可能是可互操作的。【参考方案2】:

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

如果您想变得花哨,您可以构建一个查询用户角色和帐户,仅授予对它的读取权限,甚至使用资源调控器将该内置角色用户帐户限制为系统总负载的某个百分比如果需要的话。

在将 Access 中的新内容汇总为实际代码之前对其进行原型设计并不可耻。

【讨论】:

@Nick “让他们继续使用 Access”并不是对“这个软件现在处于开发的最后阶段”的回答。 @Danny Beckett,您显然没有按照我的意图阅读答案。 C# 中的cooked 应用程序是执行cook-in 任务的正确方法,但对于一些需要临时报告的特殊人员来说,让他们使用Access ALSO 来做这可能是比编写更好的答案/linking-in YA 自定义查询工具。 M$ 为 Access 投入了 10 万工时,以使其能够胜任他希望他仍然拥有的任务。 @Mark 不要误会我的意思,Access 在某些方面非常有用......但是当 OP 明确表示他的任务是重写应用程序时,它处于最后阶段,它不是对 OP 最相关的答案,imo。我显然也很想看看人们提出什么答案以及 OP 选择了哪些答案,因为这是我自己可能会使用的东西。 我推荐使用 MS Access 对 SQL Server 数据库执行查询,因为客户端已经拥有它。这是对OP问题的合理解决方案。 我和马克在一起。高级用户熟悉 Access:让我们尝试抽象 DB 层,保持用户工具的功能。从 MS 有一个关于如何创建链接到 SQL Server 的 Access DB 的链接(链接到的数据,而不是复制到的数据)。【参考方案3】:

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

【讨论】:

这也是个好主意!更好的是,他们可以共享报告,它不会一次用 200 个请求淹没服务器,并且您可以在连接器中处理受限访问用户并将他们减少为仅使用角色/应用访问方法。【参考方案4】:

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

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

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

【讨论】:

这是@Yaqub 在他的回答中提供的完全相同的链接。

以上是关于winforms 应用程序中的查询设计器的主要内容,如果未能解决你的问题,请参考以下文章

适用于 .Net Core 3.1 的 Visual Studio 2019 中的 WinForms 设计器窗口

VS2010 winform程序中的窗体文件如何查看设计

在设计器中为 winforms 应用程序打开的表单的运行上下文是啥

简化查询以用作 winform rdlc 报告中的数据集

Winforms - 如何在设计器中显示/隐藏元素?

由于旧的程序集引用,无法在 VS2012 中加载 Winforms 设计器