编写Winforms动态查询工具

时间:2012-03-09 21:42:42

标签: c# sql winforms dynamic adhoc

我的任务是编写一个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的最佳方法的建议。

3 个答案:

答案 0 :(得分:1)

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

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

Versabanq Squel是一个健壮且免费的SQL查询工具。

There are many others

And even more here

答案 1 :(得分:0)

在我看来,基于您的示例架构,您最好的选择是创建一个预定义所有连接的视图。

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

答案 2 :(得分:-1)

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

这是一个更简单的方法:

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

在一天结束时,您将获得一个强大的可重用查询存储库,您自己将控制其质量。而不是让用户点击创建甚至无法重复使用的潜在怪物!!