我的任务是编写一个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
的最佳方法的建议。
答案 0 :(得分:1)
我很欣赏你从头开始写这篇文章的冲动,毕竟它具有挑战性和乐趣!但是,不要浪费宝贵的资源来编写已经多次写过的东西。创建一个功能强大且安全的查询工具要复杂得多,表面上看起来似乎很复杂。
SQL Server 2008 Management Studio Express上次检查时是免费的。
Versabanq Squel是一个健壮且免费的SQL查询工具。
答案 1 :(得分:0)
在我看来,基于您的示例架构,您最好的选择是创建一个预定义所有连接的视图。
此外,似乎你让他们根据某些字段和参数搜索你的数据库,而不是真的让他们写查询,因为他们本身不是sql literate。它仍然不是一个简单的任务(imho),但是一旦你有了视图,你可以向他们呈现“可搜索”字段,以及他们可以选择的“可显示”字段(等待'直到你开始处理复杂的where子句:)
答案 2 :(得分:-1)
我认为你的做法是错误的。您的用户必须能够加入所有这些表格组合吗?他们甚至知道连接是什么吗?
这是一个更简单的方法:
在一天结束时,您将获得一个强大的可重用查询存储库,您自己将控制其质量。而不是让用户点击创建甚至无法重复使用的潜在怪物!!