编写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
的最佳方法的建议。
我很感激你从头开始写这篇文章的冲动,毕竟它很有挑战性,也很有趣!但不要犯这样的错误,浪费宝贵的资源来写一些已经写了很多遍的东西。创建一个功能强大且安全的查询工具要比表面上看起来复杂得多。
SQL Server 2008 Management Studio Express上次检查时是免费的。
VersabanqSquel是一个健壮且免费的sql查询工具。
还有许多其他
这里还有更多
在我看来,根据您的示例模式,您最好的选择是创建一个预定义了所有联接的视图。
此外,你似乎让他们根据某些字段和参数搜索你的数据库,而不是让他们编写查询,因为他们本身不懂sql。这仍然不是一项简单的任务(imho),但一旦你有了视图,你就可以向他们展示"可搜索"字段,以及他们可以选择的"可显示"字段(等待,直到您开始处理复杂的where子句:)
我认为你的做法不对。您的用户必须能够加入所有这些表的组合吗?他们知道加入是什么吗?
这里有一个更简单的途径:
- 创建用户要执行的查询数据库
- 我想您的查询将采用参数。这些应该标记带有占位符
- 您的界面将为用户显示所有可能的查询。一旦用户选择了他们想要使用的查询(基于当然是描述性名称),接口将解析查询参数占位符,并为用户输入生成一个表单(基于以上假设的课程参数)
最终,您将拥有一个强大的可重用查询存储库,您自己将控制其质量。而不是让用户点击来创建甚至不能重复使用的隐藏怪物!!