0

一直在这里追我的尾巴,试图弄清楚如何为使用 4 个参数的 Windows 窗体创建 SQL 查询。我的表单通过 OLEDB 连接到 VFP 表。在我的表单中,我有 4 个组合框,Item From、Item To、Date From 和 Date To。填充gridview的我的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 个组合框来实现呢?

我在这里先向您的帮助表示感谢,

克里斯

4

2 回答 2

1

您可以动态构建查询:

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 放置的逻辑有点重复。如果您使用两个以上的约束来执行此操作,那么您可能希望将它们封装到约束列表(字符串列表)中,然后在最后将它们连接起来。

于 2013-10-08T13:54:46.663 回答
0

因为您使用的是OLEDB,所以每个?本身就是一个参数。

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

于 2013-10-08T13:47:51.710 回答