没有选中任何复选框时出现SQL错误

时间:2016-03-24 16:23:08

标签: c# sql

我可以检查所有或其中任何一个复选框的功能。但是,如果它们都未经检查,我会收到一条SQL错误:“'”附近的语法错误。关键字' OR'附近的语法不正确。

string andOr = string.Format(" {0} (", whereAnd);
                if ((!box1)
                    || (!box2)
                    || (!box3)
                {
                    whereAnd = " AND ";
                    if (box1)
                    {
                        sqlCommand.Append(andOr);
                        sqlCommand.Append("(h.object= 0)");
                        andOr = " OR ";
                    }
                    if (box2)
                    {
                        sqlCommand.Append(andOr);
                        sqlCommand.Append("(h.object= 1)");
                        andOr = " OR ";
                    }
                    if (box3)
                    {
                        sqlCommand.Append(andOr);
                        sqlCommand.Append("(h.object= 2)");
                    }
                    sqlCommand.AppendLine(")");
                }

然后它为我的查询做了其他一切。

我一直试图确定如何处理没有被检查的盒子。我是否在第一个if语句之外,如果(!box1)&& (!box2)&& (!box3)....如果是这样,SQL需要我跳过这些选择。

OR

我是否进入if语句,在检查了方框1,2和3之后,我做了其他操作,因为没有检查这些。同样,如果我这样做,我需要告诉SQL不包括这些选择?

修改

这是整个SQL命令

DECLARE @jFN NVARCHAR(MAX)=''
DECLARE @sFN NVARCHAR(MAX)=''
DECLARE @sd DateTime='2016-02-24T05:00:00'
DECLARE @ed DateTime='2016-03-25T03:59:59'
DECLARE @jFId INT
EXEC dbo.GFId @jFName, @jFId OUTPUT
DECLARE @jFDescendants TABLE(fo_id INT)
INSERT INTO @jFDescendants EXEC dbo.GetFDescendants @jFId
DECLARE @sFId INT
EXEC dbo.GFId @sFName, @sFId OUTPUT
DECLARE @sFDescendants TABLE(fo_id INT)
INSERT INTO @sFDescendants EXEC dbo.GFDescendants @sFId

    select  h.object,
            h.id,
            h.se_id,
            h.co_time,
            h.ho_time,
            h.sc_time,
            h.st_time           

            CASE
                 WHEN h.id <> 0
                    THEN j.fo_id
                 ELSE u.fo_id
            END as fo_id
            from dbo.myDB AS h
    LEFT OUTER JOIN dbo.Jo AS j ON h.id = j.id
    LEFT OUTER JOIN dbo.Se AS u ON h.se_id = u.se_id
    LEFT OUTER JOIN dbo.Fo AS js ON j.fo_id = js.fo_id
    LEFT OUTER JOIN dbo.Fo AS ss ON u.fo_id = ss.fo_id
    )
      AND  ((h.co_time BETWEEN @sd AND @ed)
     OR (h.ho_time BETWEEN @sd AND @ed)
     OR (h.sc_time BETWEEN @sd AND @ed)
     OR (h.st_time BETWEEN @sd AND @ed)
    )
    AND (js.fo_id IN (select fo_id from @jFD)
    OR ss.fo_id IN (select fo_id from @sFD))
    ORDER BY h.co_time DESC

在行AND之前((h.co_time BETWEEN @sd AND @ed)是这个sql命令的位置。如果只检查了2,它将如下所示:

LEFT OUTER JOIN dbo.Fo AS ss ON u.fo_id = ss.fo_id
        WHERE  ((h.object= 0) OR (h.object = 1))
          AND  ((h.co_time BETWEEN @sd AND @ed)
         OR (h.ho_time BETWEEN @sd AND @ed)
    ...etc

4 个答案:

答案 0 :(得分:4)

您始终在查询中添加“)”。您需要重构逻辑以使其按预期工作。

            if (box1 || box2 || box3)
            {
                var op = " AND (";
                if (box1)
                {
                    sqlCommand.Append(op);
                    sqlCommand.Append("(h.object= 0)");
                    op = " OR ";
                }
                if (box2)
                {
                    sqlCommand.Append(op);
                    sqlCommand.Append("(h.object= 1)");
                    op = " OR ";
                }
                if (box3)
                {
                    sqlCommand.Append(op);
                    sqlCommand.Append("(h.object= 2)");
                }
                sqlCommand.AppendLine(")");
            }

答案 1 :(得分:-1)

所以我知道这不是我最好的帖子。这是我没有写的代码,我必须弄清楚然后修复。我还没有完成ADO.NET的工作,但是我能够找到一个解决方案来解决一个非常简单的问题。这是我以前用来做的代码

string andOr = string.Format(" {0} (", whereAnd);
                if ((box1)
                    || (box2)
                    || (box3)
                {
                    whereAnd = " AND ";
                    if (box1)
                    {
                        sqlCommand.Append(andOr);
                        sqlCommand.Append("(h.object= 0)");
                        andOr = " OR ";
                    }
                    if (box2)
                    {
                        sqlCommand.Append(andOr);
                        sqlCommand.Append("(h.object= 1)");
                        andOr = " OR ";
                    }
                    if (box3)
                    {
                        sqlCommand.Append(andOr);
                        sqlCommand.Append("(h.object= 2)");
                    }
                    sqlCommand.AppendLine(")");
                }
               else
                {
                    whereAnd = " WHERE ";
                    sqlCommand.Append(andOr);
                    sqlCommand.AppendLine("(h.object IS null ");
                    sqlCommand.AppendLine("))");
                    whereAnd = " AND ";
                }

这将检查每个要检查的框。如果选中任何一个,它将附加每个h.object(0,1或2)。如果没有被检查,它将跳转到if else并且它将返回任何空的h.objects(我没有任何因此它将不返回任何内容)。由于OP不是很清楚,我想发帖解释我的目的。

答案 2 :(得分:-2)

我建议使用类似的结构:

        string query = @"SELECT * 
                        FROM TABLE (NOLOCK) 
                        WHERE (@pBox1 = 1 OR @pBox2 = 1 OR @pBox3 = 1) 
                        AND (@pBox1 = 0 OR (@pBox1 =1 AND h.object= 0))
                        AND (@pBox2 = 0 OR (@pBox2 =1 AND h.object= 1))
                        AND (@pBox3 = 0 OR (@pBox3 =1 AND h.object= 2))
                        ";
        sqlCommand.Parameters.AddWithValue("pBox1", box1);
        sqlCommand.Parameters.AddWithValue("pBox2", box2);
        sqlCommand.Parameters.AddWithValue("pBox3", box3);

我认为它更清晰,更容易理解

答案 3 :(得分:-2)

这不是一个sql问题。这是一个通用的Web开发问题。

当您提交带有复选框的html表单时,会发生以下两种情况之一。您可以在逗号分隔列表中获取包含所有选中值的变量,或者,如果用户未选中任何框,则不会得到任何内容。

必须在Web应用程序代码中处理缺少变量。在你的情况下,那就是c#。如何做到这一点取决于您的具体要求。