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

时间:2013-01-27 10:40:20

标签: .net sql winforms user-interface

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

他们刚刚要求的一件事就是能够进行自定义查询,软件的UI目前可能无法在他们需要的时候让他们这样做。

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

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

更新

我已经将Yaqub的答案标记为答案,因为这是我当时最接近我想要的答案。我最后为他们写了一个自定义表单来生成他们的查询:

enter image description here

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

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

修改

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

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

答案 1 :(得分:3)

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

如果您想获得想象力,可以构建查询用户角色和帐户,仅授予对其的读取权限,甚至使用资源调控器将该已烘焙角色用户帐户限制为总系统负载的某个百分比必要的东西。

在将新内容编入实际代码之前,对原型中的新内容进行原型设计并不会感到羞耻。

答案 2 :(得分:3)

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

答案 3 :(得分:-2)

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

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

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