asp.net 实现多条件查询 包括时间

Wonderful1025 2014-08-27 10:45:16
  /// <summary>
/// 拼接查询条件
/// </summary>
/// <param name="strSql">查询sql主体</param>
/// <param name="entity">条件实体</param>
/// <returns></returns>
public static String CreateSearchSql(String strSql,Object entity)
{
PropertyInfo[] propertys = entity.GetType().GetProperties();
foreach (PropertyInfo p in propertys)
{
if (p.PropertyType == typeof(System.String) && p.GetValue(entity, null) != null)
{
if (p.GetValue(entity, null).ToString() != String.Empty)
strSql += " AND " + p.Name + " LIKE '%" + p.GetValue(entity, null).ToString() + "%'";
}
else if (p.PropertyType == typeof(System.Int32))
{
if (Convert.ToInt32(p.GetValue(entity, null)) != 999)
strSql += " AND " + p.Name + " = " + Convert.ToInt32(p.GetValue(entity, null));
}
else if (p.PropertyType == typeof(System.Int64))
{
if (Convert.ToInt64(p.GetValue(entity, null)) != 999)
strSql += " AND " + p.Name + " = " + Convert.ToInt64(p.GetValue(entity, null));
}
//else if (p.PropertyType == typeof(System.DateTime))
//{
// if(p.GetValue(entity,null).ToString()!=String.Empty)
// strSql+="AND"+p.Name+">"
//}
}

return strSql;
}

我已经拼接了其他的实体 但是时间段的查询怎么弄 在这原有的代码中改
...全文
545 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sglogin 2014-09-11
  • 打赏
  • 举报
回复
页面的代码是这样的
	// 查询按钮事件
	protected void btnSearch_Click(object sender, EventArgs e)
	{
		try
		{
			StringBuilder strWhere = new StringBuilder();
			List<NameValue> lstWhereInfo = new List<NameValue>();
			StringBuilder strAnd = new StringBuilder();
			if (txtYearMonthSearch.Text != "")//年度月份
			{
				CommTool.DynamicParameter.AddModel2List(ref lstWhereInfo, "BackApply.YearMonth", txtYearMonthSearch.Text);
				strWhere.Append(strAnd + " YearMonth=@YearMonth");
				if (strAnd.Length > 0) { strAnd.Remove(0, strAnd.Length); } strAnd.Append(" And");
			}
			if (txtBackApplyDateSearchBeg.Text != "")//申请时间起始
			{
				CommTool.DynamicParameter.Append2WhereEqualBig(ref strWhere, ref lstWhereInfo, "BackApply.BackApplyDate", "BackApplyDateBeg", txtBackApplyDateSearchBeg.Text, ref strAnd);
			}
			if (txtBackApplyDateSearchEnd.Text != "")//申请时间截止
			{
				CommTool.DynamicParameter.Append2WhereEqualLit(ref strWhere, ref lstWhereInfo, "BackApply.BackApplyDate", "BackApplyDateEnd", txtBackApplyDateSearchEnd.Text, ref strAnd);
			}
			//if (txtBackApplyDateSearch.Text != "") { CommTool.DynamicParameter.AddModel2List(ref lstWhereInfo, "BackApply.BackApplyDate", txtBackApplyDateSearch.Text); strWhere.Append(strAnd + " BackApplyDate=@BackApplyDate"); if (strAnd.Length > 0) { strAnd.Remove(0, strAnd.Length); } strAnd.Append(" And"); }//申请时间
			if (ddlSupplierIDSearch.SelectedIndex != 0)//供应商
			{
				CommTool.DynamicParameter.AddModel2List(ref lstWhereInfo, "SupplierID", ddlSupplierIDSearch.SelectedValue);
				strWhere.Append(strAnd + " BackApply.SupplierID=@SupplierID");
				if (strAnd.Length > 0) { strAnd.Remove(0, strAnd.Length); } strAnd.Append(" And");
			}

			DataTable dt = dal.GetDataSet(strWhere.ToString(), lstWhereInfo);
			rptList.DataSource = dt;
			rptList.DataBind();
		}
		catch (Exception err)
		{
			JscriptMsg(CommApp.BLL.CommonToolBLL.GetErrMsg(err, Request.Path), "Error", 2);
		}
	}
条件可按需求修改的 数据访问类的代码是这样的

		/// <summary>
		/// 获得查询数据
		/// </summary>
		public DataTable GetDataTable(string strWhere, List<NameValue> lstWhereInfo)
		{
			StringBuilder strSql = new StringBuilder();
			strSql.Append("select * from BackApply");
			if(strWhere.Trim() != "")
			{
				strSql.Append(" where " + strWhere);
			}
			SqlParameter[] parameters = CommTool.DynamicParameter.SqlDynamicParameter(lstWhereInfo);
			return dbt.QueryDataTable(strSql.ToString(), parameters);
		}
Wonderful1025 2014-09-09
  • 打赏
  • 举报
回复
引用 21 楼 sglogin 的回复:
我们是用一个string传递sql,同时用一个List传递参数名和参数的值,然后到数据层转成parameter
具体点
sglogin 2014-09-09
  • 打赏
  • 举报
回复
我们是用一个string传递sql,同时用一个List传递参数名和参数的值,然后到数据层转成parameter
Wonderful1025 2014-09-05
  • 打赏
  • 举报
回复
引用 19 楼 sglogin 的回复:
查询的参数用实体传递不太方便
求指点
sglogin 2014-08-29
  • 打赏
  • 举报
回复
查询的参数用实体传递不太方便
  • 打赏
  • 举报
回复
n你这么做有啥意义。。。。。反射用在where上就是找死啊 > < >= <= 同一天 in not in
於黾 2014-08-28
  • 打赏
  • 举报
回复
不好意思,错了,还是需要另一个entity来放时间,毕竟里面要同时放列名和值
於黾 2014-08-28
  • 打赏
  • 举报
回复
如果你要传2个时间,一个开始,一个结束,你应该想办法把他俩放一起,然后再分解出来处理 不过我觉得就你的这个需求,还是单独传2个时间进来算了 反正不管哪个表,保证都要有时间字段的(即使没有,传个空进来) 然后判断一下只要传入的时间不为空,就拼接进去 不要用between 有些时候,我就是想查XX日之前的所有数据,或XX日之后的所有数据,用between就不合理了 2个时间用>和<分别进行拼接 可以再加个datetime[2]参数专门就放2个时间,不放别的(因为每个表的时间字段列名可能会不同,所以还是要把列名传进来)
淡淡的活着 2014-08-28
  • 打赏
  • 举报
回复
没注意 还和你的真补一样 不过一样的 可以用sql里面的区间参数·Between
淡淡的活着 2014-08-28
  • 打赏
  • 举报
回复
我以前也是用这个的· else if (a != null && b != null) { criteria.Add(NHibernate.Criterion.Expression.Between("Sqsj", a, b)); } A B是两个时间
shang_1442123152 2014-08-28
  • 打赏
  • 举报
回复
在固定时间段多条件查询示例 //下拉列表框设置查询省、市、男、女信息 <asp:DropDownList ID="ddlProvince" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlProvince_SelectedIndexChanged"> </asp:DropDownList> <asp:DropDownList ID="ddlCity" runat="server"> </asp:DropDownList> <asp:RadioButtonList ID="radlistSex" runat="server" RepeatDirection="Horizontal" Width="90px" Font-Size="12px"> <asp:ListItem Selected="True"> 男</asp:ListItem> <asp:ListItem>女</asp:ListItem> </asp:RadioButtonList> //查询按钮 <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/image/a2.png" OnClick="ImageButton1_Click" /> //绑定数据库显示下拉列表信息 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { sqlcon = new SqlConnection(strCon); string sqlstr = "select Province from tb_Province"; sqlcon.Open(); SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon); DataSet myds = new DataSet(); myda.Fill(myds); ddlProvince.DataSource = myds; ddlProvince.DataValueField = "Province"; ddlProvince.DataBind(); string strCity = "select * from tb_City where Province='" + ddlProvince.SelectedItem.Text + "'"; SqlDataAdapter mydaCity = new SqlDataAdapter(strCity, sqlcon); DataSet mydsCity = new DataSet(); mydaCity.Fill(mydsCity); ddlCity.DataSource = mydsCity; ddlCity.DataValueField = "City"; ddlCity.DataBind(); sqlcon.Close(); } } protected void ddlProvince_SelectedIndexChanged(object sender, EventArgs e) { sqlcon = new SqlConnection(strCon); string sqlstr = "select * from tb_City where Province='" + ddlProvince.SelectedItem.Text + "'"; SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon); DataSet myds = new DataSet(); sqlcon.Open(); myda.Fill(myds); ddlCity.DataSource = myds; ddlCity.DataValueField = "City"; ddlCity.DataBind(); sqlcon.Close(); } protected void ImageButton1_Click(object sender, ImageClickEventArgs e) { if (this.ddlCity.SelectedValue != "") { Session["searchKey1"] = ddlCity.SelectedItem.Text; Session["searchKey2"] = radlistSex.SelectedValue.Trim(); Response.Redirect("Cha_Xuen.aspx"); } else { Response.Write("<script>alert('还没有信息!');location='Yhguanli.aspx'</script>"); }//CodeGo.net/ } //查询Cha_Xuen.aspx页面信息 protected void bindDataList() { int noncePage = Convert.ToInt32(labPage.Text); PagedDataSource ps = new PagedDataSource(); string sqlSel1 = "select tb_HuenLian.HenuID,tb_huen_lian.UserName,tb_huen_lian.QQ,tb_HuenLian.nickName,tb_HuenLian.Images,tb_HuenLian.sex,tb_HuenLian.Province,tb_HuenLian.city from tb_huen_lian,tb_HuenLian where tb_huen_lian.UserName = tb_HuenLian.UserName and tb_HuenLian.sex like '%" + Session["searchKey2"] + "%' and tb_HuenLian.city like '%" + Session["searchKey1"] + "%'"; ps.DataSource = operateData.getRows(sqlSel1).DefaultView; ps.AllowPaging = true; ps.PageSize = 8; ps.CurrentPageIndex = noncePage - 1; this.lnkbtnFront.Enabled = true; this.lnkbtnNext.Enabled = true; this.lnkbtnLast.Enabled = true; this.lnkbtnFirst.Enabled = true; labBackPage.Text = Convert.ToString(ps.PageCount); DataList1.DataSource = ps; DataList1.DataBind(); }
e251396 2014-08-28
  • 打赏
  • 举报
回复
你一个区间的话,必须有>=和<=的。这个时候entity实体有一个时间属性,但必须为string类型,值为2014-08-28,2014-08-29,解析的时候就得判断每个属性的值有没有“,”。有的话,就拼接成>=和<=。
Wonderful1025 2014-08-28
  • 打赏
  • 举报
回复
引用 8 楼 qq_15185769 的回复:
[quote=引用 4 楼 wangjia1991 的回复:] strSql += " AND " + p.Name + " > " + Convert.DateTime(p.GetValue(entity, null).ToString()); 直接这么写应该不会错的
就是他这么弄可以的啊,以前做过,就这么弄[/quote] 你确信?? 你尝试过
jun471537173 2014-08-27
  • 打赏
  • 举报
回复
oracle,sqlserver还是其他?
ayanamireizero 2014-08-27
  • 打赏
  • 举报
回复
直接用datediff拼接啊....
wangjia1991 2014-08-27
  • 打赏
  • 举报
回复
你就按上面的例子写,时间段自己按要求设置不就行了,假设时间间隔一个月你用Convert.DateTime(p.GetValue(entity, null).AddMonths(1).ToString(),不就行了。可以是:<或者是<=。
jun471537173 2014-08-27
  • 打赏
  • 举报
回复
引用 6 楼 Wonderful1025 的回复:
[quote=引用 4 楼 wangjia1991 的回复:] strSql += " AND " + p.Name + " > " + Convert.DateTime(p.GetValue(entity, null).ToString()); 直接这么写应该不会错的
我就一个日期字段 判断的是在一个区间内 [/quote] 把这个字段定义成类、数组或List,包含开始时间和结束时间
一个大猴子 2014-08-27
  • 打赏
  • 举报
回复
引用 4 楼 wangjia1991 的回复:
strSql += " AND " + p.Name + " > " + Convert.DateTime(p.GetValue(entity, null).ToString()); 直接这么写应该不会错的
就是他这么弄可以的啊,以前做过,就这么弄
Wonderful1025 2014-08-27
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
你直接把参数都给扔数组里了? 那你如何判断时间是开始时间还是结束时间? 参数数组结构不合理啊.
恩呢 怎么做才合理呢 求教
Wonderful1025 2014-08-27
  • 打赏
  • 举报
回复
引用 4 楼 wangjia1991 的回复:
strSql += " AND " + p.Name + " > " + Convert.DateTime(p.GetValue(entity, null).ToString()); 直接这么写应该不会错的
我就一个日期字段 判断的是在一个区间内
加载更多回复(3)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧