在存储过程中订立个临时查询组合变量
你把所有可以能要利用的关键条件当参数传递进来。
比如传递
@sex
@name
@age
..........
declare @strFilter nvarchar(300)
if(@sex='')
@strFilter=@strFilter+'sex='@sex cast(as nvarchar)'
...........................
具体语法自己研究,只是给个思路
你把所有可以能要利用的关键条件当参数传递进来。
比如传递
@sex
@name
@age
..........
declare @strFilter nvarchar(300)
if(@sex='')
@strFilter=@strFilter+'sex='@sex cast(as nvarchar)'
...........................
具体语法自己研究,只是给个思路
using System.Collections.Generic;
using System.Text;namespace DBUtility
{
public enum SqlOperator
{
/// <summary>
/// Like 模糊查询
/// </summary>
Like, /// <summary>
/// = is equal to 等于号
/// </summary>
Equal, /// <summary>
/// <> (≠) is not equal to 不等于号
/// </summary>
NotEqual, /// <summary>
/// > is more than 大于号
/// </summary>
MoreThan, /// <summary>
/// < is less than 小于号
/// </summary>
LessThan, /// <summary>
/// ≥ is more than or equal to 大于或等于号
/// </summary>
MoreThanOrEqual, /// <summary>
/// ≤ is less than or equal to 小于或等于号
/// </summary>
LessThanOrEqual, /*
不支持下面两个符号
/// <summary>
/// 在某个值的中间,拆成两个符号 >= 和 <=
/// </summary>
Between, /// <summary>
/// 在某个字符串值中
/// </summary>
In
*/
}
}
using System.Collections.Generic;
using System.Text;namespace DBUtility
{
/// <summary>
/// 查询信息实体类
/// </summary>
public class SearchInfo
{
public SearchInfo() {} /// <summary>
/// 构造函数
/// </summary>
/// <param name="fieldName">字段名称</param>
/// <param name="fieldValue">字段的值</param>
/// <param name="sqlOperator">字段的Sql操作符号</param>
public SearchInfo(string fieldName, object fieldValue, SqlOperator sqlOperator)
: this(fieldName, fieldValue, sqlOperator, false)
{ } /// <summary>
/// 构造函数
/// </summary>
/// <param name="fieldName">字段名称</param>
/// <param name="fieldValue">字段的值</param>
/// <param name="sqlOperator">字段的Sql操作符号</param>
/// <param name="excludeIfEmpty">如果字段为空或者Null则不作为查询条件</param>
public SearchInfo(string fieldName, object fieldValue, SqlOperator sqlOperator, bool excludeIfEmpty)
{
this.fieldName = fieldName;
this.fieldValue = fieldValue;
this.sqlOperator = sqlOperator;
this.excludeIfEmpty = excludeIfEmpty;
} private string fieldName;
private object fieldValue;
private SqlOperator sqlOperator;
private bool excludeIfEmpty = false;
/// <summary>
/// 字段名称
/// </summary>
public string FieldName
{
get { return fieldName; }
set { fieldName = value; }
} /// <summary>
/// 字段的值
/// </summary>
public object FieldValue
{
get { return fieldValue; }
set { fieldValue = value; }
} /// <summary>
/// 字段的Sql操作符号
/// </summary>
public SqlOperator SqlOperator
{
get { return sqlOperator; }
set { sqlOperator = value; }
} /// <summary>
/// 如果字段为空或者Null则不作为查询条件
/// </summary>
public bool ExcludeIfEmpty
{
get { return excludeIfEmpty; }
set { excludeIfEmpty = value; }
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data;
using System.Collections;namespace DBUtility
{
public class SearchCondition
{
private Hashtable conditionTable = new Hashtable();
public Hashtable ConditionTable
{
get { return this.conditionTable; }
}
/// <summary>
/// 为查询添加条件
/// <example>
/// 用法一:
/// SearchCondition searchObj = new SearchCondition();
/// searchObj.AddCondition("Test", 1, SqlOperator.NotEqual);
/// searchObj.AddCondition("Test2", "Test2Value", SqlOperator.Like);
/// string conditionSql = searchObj.BuildConditionSql();
///
/// 用法二:AddCondition函数可以串起来添加多个条件
/// SearchCondition searchObj = new SearchCondition();
/// searchObj.AddCondition("Test", 1, SqlOperator.NotEqual).AddCondition("Test2", "Test2Value", SqlOperator.Like);
/// string conditionSql = searchObj.BuildConditionSql();
/// </example>
/// </summary>
/// <param name="fielName">字段名称</param>
/// <param name="fieldValue">字段值</param>
/// <param name="sqlOperator">SqlOperator枚举类型</param>
/// <returns>增加条件后的Hashtable</returns>
public SearchCondition AddCondition(string fielName, object fieldValue, SqlOperator sqlOperator)
{
this.conditionTable.Add(fielName, new SearchInfo(fielName, fieldValue, sqlOperator));
return this;
} /// <summary>
/// 为查询添加条件
/// <example>
/// 用法一:
/// SearchCondition searchObj = new SearchCondition();
/// searchObj.AddCondition("Test", 1, SqlOperator.NotEqual, false);
/// searchObj.AddCondition("Test2", "Test2Value", SqlOperator.Like, true);
/// string conditionSql = searchObj.BuildConditionSql();
///
/// 用法二:AddCondition函数可以串起来添加多个条件
/// SearchCondition searchObj = new SearchCondition();
/// searchObj.AddCondition("Test", 1, SqlOperator.NotEqual, false).AddCondition("Test2", "Test2Value", SqlOperator.Like, true);
/// string conditionSql = searchObj.BuildConditionSql();
/// </example>
/// </summary>
/// <param name="fielName">字段名称</param>
/// <param name="fieldValue">字段值</param>
/// <param name="sqlOperator">SqlOperator枚举类型</param>
/// <param name="excludeIfEmpty">如果字段为空或者Null则不作为查询条件</param>
/// <returns></returns>
public SearchCondition AddCondition(string fielName, object fieldValue, SqlOperator sqlOperator, bool excludeIfEmpty)
{
this.conditionTable.Add(fielName, new SearchInfo(fielName, fieldValue, sqlOperator, excludeIfEmpty));
return this;
} /// <summary>
/// 根据对象构造相关的条件语句(不使用参数),如返回的语句是:
/// <![CDATA[
/// Where (1=1) AND Test4 < 'Value4' AND Test6 >= 'Value6' AND Test7 <= 'value7' AND Test <> '1' AND Test5 > 'Value5' AND Test2 Like '%Value2%' AND Test3 = 'Value3'
/// ]]>
/// </summary>
/// <returns></returns>
public string BuildConditionSql()
{
string sql = " Where (1=1) ";
string fieldName = string.Empty;
SearchInfo searchInfo = null; StringBuilder sb = new StringBuilder();
foreach (DictionaryEntry de in this.conditionTable)
{
searchInfo = (SearchInfo)de.Value; //如果选择ExcludeIfEmpty为True,并且该字段为空值的话,跳过
if (searchInfo.ExcludeIfEmpty && string.IsNullOrEmpty((string)searchInfo.FieldValue))
{
continue;
} if (searchInfo.SqlOperator == SqlOperator.Like)
{
sb.AppendFormat(" AND {0} {1} '{2}'", searchInfo.FieldName,
this.ConvertSqlOperator(searchInfo.SqlOperator), string.Format("%{0}%", searchInfo.FieldValue));
}
else
{
sb.AppendFormat(" AND {0} {1} '{2}'", searchInfo.FieldName,
this.ConvertSqlOperator(searchInfo.SqlOperator), searchInfo.FieldValue);
}
} sql += sb.ToString(); return sql;
} #region 辅助函数 /// <summary>
/// 转换枚举类型为对应的Sql语句操作符号
/// </summary>
/// <param name="sqlOperator">SqlOperator枚举对象</param>
/// <returns><![CDATA[对应的Sql语句操作符号(如 ">" "<>" ">=")]]></returns>
private string ConvertSqlOperator(SqlOperator sqlOperator)
{
string stringOperator = " = ";
switch (sqlOperator)
{
case SqlOperator.Equal:
stringOperator = " = ";
break;
case SqlOperator.LessThan:
stringOperator = " < ";
break;
case SqlOperator.LessThanOrEqual:
stringOperator = " <= ";
break;
case SqlOperator.Like:
stringOperator = " Like ";
break;
case SqlOperator.MoreThan:
stringOperator = " > ";
break;
case SqlOperator.MoreThanOrEqual:
stringOperator = " >= ";
break;
case SqlOperator.NotEqual:
stringOperator = " <> ";
break;
default:
break;
} return stringOperator;
} /// <summary>
/// 根据传入对象的值类型获取其对应的DbType类型
/// </summary>
/// <param name="fieldValue">对象的值</param>
/// <returns>DbType类型</returns>
private DbType GetFieldDbType(object fieldValue)
{
DbType type = DbType.String; switch (fieldValue.GetType().ToString())
{
case "System.Int16":
type = DbType.Int16;
break;
case "System.UInt16":
type = DbType.UInt16;
break;
case "System.Single":
type = DbType.Single;
break;
case "System.UInt32":
type = DbType.UInt32;
break;
case "System.Int32":
type = DbType.Int32;
break;
case "System.UInt64":
type = DbType.UInt64;
break;
case "System.Int64":
type = DbType.Int64;
break;
case "System.String":
type = DbType.String;
break;
case "System.Double":
type = DbType.Double;
break;
case "System.Decimal":
type = DbType.Decimal;
break;
case "System.Byte":
type = DbType.Byte;
break;
case "System.Boolean":
type = DbType.Boolean;
break;
case "System.DateTime":
type = DbType.DateTime;
break;
case "System.Guid":
type = DbType.Guid;
break;
default:
break;
}
return type;
}
#endregion
}
}
/// 为查询添加条件
/// <example>
/// 用法一:
/// SearchCondition searchObj = new SearchCondition();
/// searchObj.AddCondition("Test", 1, SqlOperator.NotEqual, false);
/// searchObj.AddCondition("Test2", "Test2Value", SqlOperator.Like, true);
/// string conditionSql = searchObj.BuildConditionSql();
///
/// 用法二:AddCondition函数可以串起来添加多个条件
/// SearchCondition searchObj = new SearchCondition();
/// searchObj.AddCondition("Test", 1, SqlOperator.NotEqual, false).AddCondition("Test2", "Test2Value", SqlOperator.Like, true);
/// string conditionSql = searchObj.BuildConditionSql();
/// </example>
/// </summary>
如果是简单查询,建议根据需要分类实现,这种折中的办法会带来一些代码上的冗余,但是实现逻辑和效率还好
但是如果有比较成熟的ORM库是最理想的