具有多个变量的 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 个组合框实现这一目标呢?

提前感谢您的帮助,

克里斯

具有多个变量的 Windows 表单中的 SQL 查询

您可以动态构建查询:

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,所以每个 ? 本身就是一个参数。

要么

放入所有四个参数,根据需要重复值,要么需要让程序检查组合框的内容,找出哪个组合是相关的,然后运行适当的查询和参数。