我可以检查所有或其中任何一个复选框的功能。但是,如果它们都未经检查,我会收到一条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
答案 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#。如何做到这一点取决于您的具体要求。