具有多个变量的 Windows 表单中的 SQL 查询
本文关键字:表单 SQL 查询 Windows 变量 | 更新日期: 2023-09-27 18:34:20
在这里
追了一段时间,试图弄清楚如何为使用 4 个参数的 Windows 表单创建 SQL 查询。我的窗体通过 OLEDB 连接到 VFP 表。在我的表单中,我有 4 个组合框,项目开始、项目结束、日期开始和日期结束。我填充网格视图的 SQL 查询如下所示:
SELECT `date`, descrip, item, id, itemtype, prodclass, loc, qty
FROM kokfstut
WHERE (item BETWEEN ? AND ?) AND (`date` BETWEEN ? AND ?)
当所有 4 个组合框都有值时,这非常有用。现在我想编写 SQL 查询,以便在只有项目范围或日期范围具有值时它将起作用。但是如果我按如下方式编写它,我会收到一个错误,因为现在它认为有更多的变量(8 而不是 4)。
SELECT `date`, descrip, item, id, itemtype, prodclass, loc, qty
FROM kokfstut
WHERE ((item BETWEEN ? AND ?) AND (`date` BETWEEN ? AND ?))
OR (item BETWEEN ? AND ?) OR (`date` BETWEEN ? AND ?)
那么如何使用我的 4 个组合框实现这一目标呢?
提前感谢您的帮助,
克里斯
您可以动态构建查询:
StringBuilder sb = new StringBuilder();
sb.Append("SELECT * FROM myTable");
DateTime dateFrom;
DateTime dateTo;
bool validDate = DateTime.TryParse(dateFrom_cbo.Text, out dateFrom) && DateTime.TryParse(dateTo_cbo.Text, out dateTo);
if (validDate)
{
sqlCmd.Parameters.Add("@DateFrom", dateFrom);
sqlCmd.Parameters.Add("@DateTo", dateTo);
sb.Append(" WHERE date BETWEEN @DateFrom AND @DateTo");
}
int itemFrom;
int itemTo;
bool validItemRange = int.TryParse(itemFrom_cbo.Text, out itemFrom) && DateTime.TryParse(itemTo_cbo.Text, out itemTo);
if (validItemRange)
{
if (validDate)
sb.Append(" AND ");
else
sb.Append(" WHERE ");
sqlCmd.Parameters.Add("@ItemFrom", itemFrom);
sqlCmd.Parameters.Add("@ItemTo", itemTo);
sb.Append(" WHERE item BETWEEN @ItemFrom AND @ItemTo");
}
WHERE 和 AND 放置的逻辑有点重复。 如果使用两个以上的约束执行此操作,则可能需要将它们封装到约束列表(字符串列表)中,然后在末尾连接它们。
因为您使用的是 OLEDB,所以每个 ? 本身就是一个参数。
要么放入所有四个参数,根据需要重复值,要么需要让程序检查组合框的内容,找出哪个组合是相关的,然后运行适当的查询和参数。