【问题标题】:Writing a Winforms Dynamic Query Tool编写 Winforms 动态查询工具
【发布时间】:2012-03-27 08:05:07
【问题描述】:

我的任务是编写一个允许用户运行即席查询的 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 的最佳方法的建议。

【问题讨论】:

  • 您的建造成本真的不到 1350 美元吗?
  • 目前没有购买外部产品的预算。

标签: c# sql winforms dynamic adhoc


【解决方案1】:

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

我上次查看时SQL Server 2008 Management Studio Express 是空闲的。

Versabanq Squel 是一个强大且免费的 sql 查询工具。

There are many others

And even more here

【讨论】:

  • 让他们访问 SQL Server Management Studio 或替代方案并不能解决我的问题。这将被不了解 SQL 的人使用。
  • 如果你真的想自己写,你可以下载这个作为起点,然后随心所欲地调整它:codeproject.com/Articles/13419/…
【解决方案2】:

在我看来,根据您的示例架构,最好的办法是创建一个包含所有预定义连接的视图。

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

【讨论】:

  • 我已经研究过创建一个所有表都加入的视图(比上面显示的更多),但问题是返回的记录的笛卡尔积使得结果几乎无法使用。我知道,一旦我到达 WHERE 子句,我的乐趣就会真正开始。
  • @bluefeet,这取决于你如何加入你的桌子,不是吗?如果你让用户选择他们希望在结果中看到的字段,它不应该给他们一个巨大的笛卡尔结果集,基本上,你会在 FROM 子句中使用一个视图,你会生成SELECT 和 WHERE 部分
【解决方案3】:

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

这是一个更简单的方法:

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

最终,您将获得一个功能强大的可重用查询存储库,您可以自行控制其质量。而不是让用户四处点击来创建甚至无法重复使用的可怕怪物!

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多