Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多个变量的Windows窗体中的SQL查询_C#_Sql_Winforms_Visual Studio 2010_Combobox - Fatal编程技术网

C# 具有多个变量的Windows窗体中的SQL查询

C# 具有多个变量的Windows窗体中的SQL查询,c#,sql,winforms,visual-studio-2010,combobox,C#,Sql,Winforms,Visual Studio 2010,Combobox,我在这里跟踪了一段时间,试图找出如何为使用4个参数的windows窗体创建SQL查询。 我的表单通过OLEDB连接到VFP表。在我的表单中,我有4个组合框,项目开始、项目结束、日期开始和日期结束。填充gridview的SQL查询如下所示: SELECT `date`, descrip, item, id, itemtype, prodclass, loc, qty FROM kokfstut WHERE (item BETWEEN ? AND ?) AND (`date` BETWEEN ?

我在这里跟踪了一段时间,试图找出如何为使用4个参数的windows窗体创建SQL查询。 我的表单通过OLEDB连接到VFP表。在我的表单中,我有4个组合框,项目开始、项目结束、日期开始和日期结束。填充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)

那么我如何用我的4个组合框实现这一点呢

提前谢谢你的帮助


Chris

因为你在使用OLEDB,每个人?它本身就是一个参数


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

您可以动态生成查询:

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

您不需要这一部分吗<代码>(项目介于?和?之间)或(日期介于?和?)WHERE子句的第一部分现在是多余的。每个项目可能有多个日期值。因此,我希望能够检查精确的项目/日期匹配,这就是我使用AND语句的原因。是的,但是您有OR语句,当只满足一个条件时,该语句将返回true(而AND语句需要两个条件)。。。所以AND语句是多余的。只有在另一种情况也是正确的情况下才是正确的。。。。所以你真的只需要一部分。。。除非你在移动变量。。。因为它们都是
我的意思是,我把
WHERE
子句看作是
WHERE(TRUE和FALSE)或TRUE或FALSE的等价物。如果你在4次约会中四处走动,可能会出错。特雷弗,我知道这可能是一个很简单的问题,但我该如何引用这个问题呢?目前,我的查询在tableAdapter中,当我按下带有以下代码的“Generate”按钮时被调用:{this.kokfstutTableAdapter.FillBy(this.dataSet1.kokfstut,comboBox1.Text,comboBox2.Text,((System.DateTime)(System.Convert.ChangeType(dateTimePicker3.Text,typeof(System.DateTime))),((System.DateTime)(System.Convert.ChangeType(dateTimePicker4.Text,typeof(System.DateTime(()()))}我的示例是使用ADO.NET SqlConnection/SqlCommand。这里有一个示例:我在“sqlCmd.Parameters.Add”方面也遇到了问题,不知何故丢失了引用或命名空间。它只允许我使用SqlCommand,但没有参数。添加可用。Trevor,在让工作人员测试表单一周后,决定不使用日期参数,而只查看从当前日期开始的未来日期。我感谢您的帮助,并给了您投票。我从来没有这样做过我很尊重代码,但我相信它会起作用的。干杯!
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");
}