动态生成SQL“OR”查询中我有我的asp.net应用程序,其中我动态构建SQL查询我在哪里使用WHERE子句和添加或取决于所输入的字段问题C#
。这里是场景。动态生成SQL“OR”查询中我有我的asp.net应用程序,其中我动态构建SQL查询我在哪里使用WHERE子句和添加或取决于所输入的字段问题C#
我有一个文本框四,出2日期时间
我想在数据库中进行搜索,如果有任何一个文本框中输入一个值,并返回被绑定到一个GridView的结果。现在,如果有多个文本框值,那么我需要添加它,并在where子句中构建OR。如果在任何一个文本框中没有值,则需要返回所有结果。但是我在构建查询时遇到了问题,因为我必须通过if else循环来查看是否有任何值或null。这是我的代码。
StringBuilder selectQuery = new StringBuilder();
disCode = SearchTextCouponCode.Text;
disName = SearchTextCouponName.Text;
if(StartDate.SelectedDate != null)
startDate = StartDate.SelectedDate.ToString("yyyy-MM-dd");
if(EndDate.SelectedDate != null)
endDate = EndDate.SelectedDate.ToString("yyyy-MM-dd");
// here is the main thing where i am getting the error
if (!string.IsNullOrEmpty(disCode))
{
selectQuery.Append("DISCOUNTCode = '" + disCode + "'");
}
if (!string.IsNullOrEmpty(disName))
{
selectQuery.Append(" OR DISCOUNTName = '" + disName + "'");
}
if (startDate != "0001-01-01")
{
selectQuery.Append(" OR StartDate = '" + startDate + "'");
}
if(endDate != "0001-01-01")
selectQuery.Append(" OR EndDate = '" + endDate + "'");
// I am using Object Data Source and the method i am passing is taking care of the SQL injection
DataSourceDis.SelectParameters["sqlCriteria"].DefaultValue = selectQuery.ToString();
GridDis.DataBind();
现在,当我运行的应用程序,并留下disCode文本框为空,则查询开始OR和给我的错误是不正确的语法不远的地方..
请帮助。
////////////////////////////////////////////// ///////////
我打电话建立这样的查询,其利用SQL注入的护理后,另一种方法
////////////// ///////////////////////////////////////////
您可以设置所有线路有" OR "
末(而不是开头),如...
selectQuery.Append("DISCOUNTCode = '" + disCode + "' OR ");
,然后使用.ToString()
面前......
if(selectQuery.Length > 0)
{
selectQuery.Length -= 4;
}
这一个解决了我的问题。 +1 – 2012-07-16 12:50:01
不客气@Patel,很高兴我能帮上忙 - 正如我在这个问题的评论中所说的那样,我会认真考虑在你构建selectQuery之前清理你的输入**,因为它比做它容易得多然后 – freefaller 2012-07-16 12:53:05
有效的SQL查询e.g. SELECT * FROM EMPLOYEE WHERE Name = 'Hat' OR SURNAME = 'SOFT'
看起来像你的情况,当查询开始或你的StringBuilder附加这样的查询 SELECT * FROM EMPLOYEE WHERE OR SURNAME = 'SOFT'
并直接后的监守无效的或关键字WHERE
多数民众赞成在这里我的观点...我怎么停止或即将到来开始..我正在使用if else看看是否有值,然后加上OR – 2012-07-16 12:30:38
我一般会做这样的;
var conds = new List<string>();
// here is the main thing where i am getting the error
if (!string.IsNullOrEmpty(disCode))
{
conds.Add("DISCOUNTCode = '" + disCode + "'");
}
if (!string.IsNullOrEmpty(disName))
{
conds.Add("DISCOUNTName = '" + disName + "'");
}
if (startDate != "0001-01-01")
{
conds.Add("StartDate = '" + startDate + "'");
}
if(endDate != "0001-01-01")
conds.Add("EndDate = '" + endDate + "'");
selectQuery.Append(String.Join(" OR ",conds));
这是一个有点可怕的建筑查询这样 - 更好地使用预处理语句或LINQ或您自己的查询构建类。
如果其中一个字段为空,那么它会在最后加上OR来做这件事。 – 2012-07-16 12:28:11
@ patel.milanb它不会 - 但无论如何,我改变了我的想法和我的回答 – 2012-07-16 12:35:54
你可以做最简单的事情就是改变WHERE
到:
WHERE 1=0
然后确保你所有的WHERE
条件开始OR
正如理查德指出然而,这不是最佳实践,你会更好地使用存储过程或LINQ。使用存储过程,你可以通过这些参数的过程,然后像做:
AND (@disName IS NULL OR [email protected])
如果使用WHERE 1=0 OR
的解决方案,你可能会影响性能。
我建议创建一个变量来标记结合,改变它,当你添加一个条件
string conjuction = " ";
if (!string.IsNullOrEmpty(disCode))
{
selectQuery.Append(conjunction);
selectQuery.Append("DISCOUNTCode = '" + disCode + "'");
conjuction = " OR ";
}
if (!string.IsNullOrEmpty(disName))
{
selectQuery.Append(conjunction);
selectQuery.Append("DISCOUNTName = '" + disName + "'");
conjuction = " OR ";
}
等
我不知道你输入的来源,但要意识到在当前代码中发生SQL注入攻击的可能性。
可以说,如果disCode存在并且所有三个参数都是空的,那么它将在最后附加OR并将导致错误。 – 2012-07-16 12:26:28
不,它真的不会 – podiluska 2012-07-16 12:27:15
@patel,我怕你错了,它会工作...这是一个不错的解决方案,虽然比绝对必要更复杂 – freefaller 2012-07-16 12:31:41
当你disCode文本框为空,则情况将是“OR DISCOUNTName”这是不对的,你不能用“OR”,其中
if (!string.IsNullOrEmpty(disCode))
{
selectQuery.Append("DISCOUNTCode = '" + disCode + "'");
}
if (!string.IsNullOrEmpty(disName))
{
selectQuery.Append(" OR DISCOUNTName = '" + disName + "'");
}
我认为OP意识到这一点......这就是为什么他们首先问这个问题 – freefaller 2012-07-16 12:32:56
使用参数化查询后。你仍然可以用相同的方式构建它,但是将文本框输入直接连接到查询中意味着你很容易受到SQL注入的影响 – 2012-07-16 12:22:13
SQL注入SQL注入SQL注入为什么仍然存在这样的问题? – n8wrl 2012-07-16 12:26:07
我建立这个查询后,正在调用另一个方法,正在照顾SQL注入 – 2012-07-16 12:31:49