编写Winforms动态查询工具

本文关键字:工具 查询 动态 Winforms 编写 | 更新日期: 2023-09-27 18:27:14

我的任务是编写一个winforms c#应用程序,允许用户运行特别查询。我在网上搜索了很多可以购买的工具(EasyQuery),但现在购买是不可能的。

所以我试着自己写这篇文章。在这一点上,我已经创建了一个树视图,它在运行时填充了表/列,我可以选择由用户检查的列。但现在我必须弄清楚如何动态地JOIN他们选择的表。

部分表格结构如下:

Table - Roles - PK = RoleId
RoleId 
RoleName
Table - Center PK = CenterId/RoleId/Prefix
CenterId  
RoleId
Prefix
Table - Employee - PK = EmployeeID
EmployeeId
Name
CenterId
Dept
Org
Table - Prof - PK = EmployeeId/Profile
EmployeeId
Profile

我总共有6个表,这些表可以在各种字段上联接,但由于用户需要动态联接,所以当他们想要生成SQL时,我需要确定JOIN。在这一点上,我不知道生成这些JOINs的最佳方法。

我甚至想过在数据库中创建一个表,为每个表/列列出JOINs,然后我可以从那里构建它,但我不知所措。

我也尝试过类似的方法,但如果有不同的方法的建议,我不想走错路:

private void GetJoins()
{
     string joinList = string.Empty;
     foreach (TreeNode tn in TablesTreeView.Nodes)
     {
         if (tn.Checked)
            if (tn.Nodes.Count > 0) // this would be parent items only
            {
                foreach (TreeNode childNode in tn.Nodes)
                {
                    // for first child checked 
                    // check the next checked parent nodes for matching checked fields
                    // if next parent node has same field name checked then add the JOIN
                 }
             }
      }
}

这看起来是在正确的轨道上吗?或者你能建议另一种方式吗?

我知道这将是一项非常困难的任务,我甚至还没有了解动态WHERE子句。我只是在寻找关于创建JOINs的最佳方法的建议。

编写Winforms动态查询工具

我很感激你从头开始写这篇文章的冲动,毕竟它很有挑战性,也很有趣!但不要犯这样的错误,浪费宝贵的资源来写一些已经写了很多遍的东西。创建一个功能强大且安全的查询工具要比表面上看起来复杂得多。

SQL Server 2008 Management Studio Express上次检查时是免费的。

VersabanqSquel是一个健壮且免费的sql查询工具。

还有许多其他

这里还有更多

在我看来,根据您的示例模式,您最好的选择是创建一个预定义了所有联接的视图。

此外,你似乎让他们根据某些字段和参数搜索你的数据库,而不是让他们编写查询,因为他们本身不懂sql。这仍然不是一项简单的任务(imho),但一旦你有了视图,你就可以向他们展示"可搜索"字段,以及他们可以选择的"可显示"字段(等待,直到您开始处理复杂的where子句:)

我认为你的做法不对。您的用户必须能够加入所有这些表的组合吗?他们知道加入是什么吗?

这里有一个更简单的途径:

  • 创建用户要执行的查询数据库
  • 我想您的查询将采用参数。这些应该标记带有占位符
  • 您的界面将为用户显示所有可能的查询。一旦用户选择了他们想要使用的查询(基于当然是描述性名称),接口将解析查询参数占位符,并为用户输入生成一个表单(基于以上假设的课程参数)

最终,您将拥有一个强大的可重用查询存储库,您自己将控制其质量。而不是让用户点击来创建甚至不能重复使用的隐藏怪物!!