转自:
某某人曾经跟我说,你们做系统不就是增删查改吗。
是啊,很多时候我们就是把用户的数据同后台数据库进行增删查改的沟通。
但是,把CRUD(增删查改)做得好,可能也不是一件很简单的事,
这里要展现的是我现在能写出来最好的Demo了,水平有限,小弟在校学生一枚,还请各位看客多多指教。
Demo前台使用JQuery EasyUI 请求一般处理程序,一般处理程序调用BLL层方法,BLL==>DAL,一个简单三层的效果。
项目结构如图:
一、数据库表结构
这里只创建一个UserInfo表,表中字段有:UserID,CardID,UPwd,UName,UAge,IsDel,AddDate
二、后台处理CRUD
后台处理添加、删除(软删除)、编辑、查询(分页)。其中查询包括:分页和搜索处理所有有点麻烦,
1、先介绍数据访问层(DAL)中的方法
这里是,添加、删除、编辑、分页查询的方法。
前台查询的参数存储在NameValueCollection中,然后在DAL层中的PreSearchParameter方法中把查询参数装配到sql语句和SqlParameter中,
在DAL层中获取的数据是DataTable,然后在BLL层中转换成JSON格式的数据传给EasyUI展示。
using System;using System.Text;using System.Data;using System.Data.SqlClient;using Dedeyi.Common;using System.Collections;using System.Collections.Generic;using System.Collections.Specialized;namespace Dedeyi.ZSF.DAL{ public class UserInfoDAL { ////// 增加一条数据 /// public int Add(Dedeyi.ZSF.Model.UserInfo model) { StringBuilder strSql=new StringBuilder(); strSql.Append("insert into UserInfo("); strSql.Append("CardID,UPwd,UName,UAge,IsDel,AddDate)"); strSql.Append(" values ("); strSql.Append("@CardID,@UPwd,@UName,@UAge,@IsDel,@AddDate)"); strSql.Append(";select @@IDENTITY"); SqlParameter[] parameters = { new SqlParameter("@CardID", SqlDbType.VarChar,16), new SqlParameter("@UPwd", SqlDbType.VarChar,64), new SqlParameter("@UName", SqlDbType.NVarChar,16), new SqlParameter("@UAge", SqlDbType.Int,4), new SqlParameter("@IsDel", SqlDbType.Bit,1), new SqlParameter("@AddDate", SqlDbType.SmallDateTime)}; parameters[0].Value = model.CardID; parameters[1].Value = model.UPwd; parameters[2].Value = model.UName; parameters[3].Value = model.UAge; parameters[4].Value = model.IsDel; parameters[5].Value = model.AddDate; object obj = SQLHelper.ExecuteScalar(strSql.ToString(),parameters); if (obj == null) { return 0; } else { return Convert.ToInt32(obj); } } ////// 删除用户 /// /// public void Del(int keyid) { //此处软删除 string s = "update UserInfo set IsDel=1 where UserID="+keyid; SQLHelper.ExecuteNoneQuery(s,null); } //////更新一条数据 /// public bool Update(Dedeyi.ZSF.Model.UserInfo model) { StringBuilder strSql = new StringBuilder(); strSql.Append("update [UserInfo] set "); strSql.Append(" CardID=@CardID,"); strSql.Append(" UPwd=@UPwd,"); strSql.Append(" UName=@UName,"); strSql.Append(" UAge=@UAge "); //strSql.Append(" IsDel=@IsDel,"); //strSql.Append("AddDate=@AddDate"); strSql.Append(" where UserID=@UserID"); SqlParameter[] parameters = { new SqlParameter("@UserID", SqlDbType.Int,4), new SqlParameter("@CardID", SqlDbType.VarChar,16), new SqlParameter("@UPwd", SqlDbType.VarChar,64), new SqlParameter("@UName", SqlDbType.NVarChar,16), new SqlParameter("@UAge", SqlDbType.Int,4), //new SqlParameter("@IsDel", SqlDbType.Bit,1), //new SqlParameter("@AddDate", SqlDbType.DateTime), }; parameters[0].Value = model.UserID; parameters[1].Value = model.CardID; parameters[2].Value = model.UPwd; parameters[3].Value = model.UName; parameters[4].Value = model.UAge; //parameters[5].Value = model.IsDel; //parameters[6].Value = model.AddDate; int rows = SQLHelper.ExecuteNoneQuery(strSql.ToString(),parameters); if (rows > 0) { return true; } else { return false; } } //分页相关的 #region ////// 获取条件查询数据行数 /// /// 关键字,UName,UAge,在前台请求形成Hashtable作为参数时候要用到这个 ///数据行数 public int GetSearchCount(NameValueCollection nv) { string sc; SqlParameter[] ps; PreSearchParameter(nv, out sc, out ps); string sql = "select count(0) from UserInfo where " + sc; return Convert.ToInt32(SQLHelper.ExecuteScalar(sql, ps)); } ////// 获取条件查询的分页数据 /// /// /// /// 关键字,UName,UAge,在前台请求形成Hashtable作为参数时候要用到这个 ///public DataTable GetSearchPage(int index, int size,NameValueCollection nv) { string f = "UserID,CardID,UPwd,UName,UAge,AddDate"; string o = "AddDate DESC"; return GetSearchePage(index,size,nv,f,o); } /// /// 获取分页数据 /// /// 当前页 /// 每一页数据行数 /// 查询条件key是字段,value是对应的值 /// 要返回的字段 /// 排序规则不要order by ,如 AddDate desc,userid asc ///private DataTable GetSearchePage(int index, int size, NameValueCollection nv, string fieldList,string orderby) { string sc ; //过滤条件 SqlParameter[] ps; PreSearchParameter(nv,out sc,out ps); string sql = "select * from (select {0},ROW_NUMBER() over(order by {1}) as num from UserInfo where {2}) as tb"; sql += " where num between {3} and {4}"; sql = string.Format(sql, fieldList, orderby, sc, (index - 1) * size + 1, index * size); return SQLHelper.GetDataTable(sql, ps); } /// /// 把查询参数转换为sql,和SqlParameter /// /// 关键字,UName,UAge,在前台请求形成Hashtable作为参数时候要用到这个 /// /// private void PreSearchParameter(NameValueCollection nv, out string sql, out SqlParameter[] paras) { sql = " '1'='1' and IsDel=0"; Listlist = new List (); if (!string.IsNullOrEmpty(nv["UName"])) { sql += " and UName like @UName"; list.Add(new SqlParameter("@UName", "%" + nv["UName"] + "%")); } int tAge; if (int.TryParse(nv["UAge"],out tAge)) { sql += " and UAge=" + nv["UAge"]; } paras = list.ToArray(); } #endregion }}
2、然后在业务逻辑层,做一些逻辑处理(JSON格式转换、添加预设值)
using Dedeyi.ZSF.DAL;using Dedeyi.ZSF.Model;using Dedeyi.Common;using System;using System.Collections.Specialized;namespace Dedeyi.ZSF.BLL{ public class UserInfoBLL { UserInfoDAL dal=new UserInfoDAL(); ////// 添加 /// /// ///public int Add(UserInfo user) { user.AddDate = DateTime.Now; user.IsDel = false; return dal.Add(user); } /// /// 删除用户 /// /// public void Del(int keyid) { dal.Del(keyid); } //////更新一条数据 /// public bool Update(Dedeyi.ZSF.Model.UserInfo model) { return dal.Update(model); } //分页相关的 #region ////// 获取条件查询数据行数 /// /// 关键字,UName,UAge,在前台请求形成Hashtable作为参数时候要用到这个 ///数据行数 public int GetSearchCount(NameValueCollection ht) { return dal.GetSearchCount(ht); } ////// 获取条件查询的分页数据 /// /// /// /// 关键字,UName,UAge,在前台请求形成Hashtable作为参数时候要用到这个 ///json格式的数据集 public string GetSearchPage(int index, int size,NameValueCollection ht) { return JSONHelper.DataTableToJson(dal.GetSearchPage(index,size,ht)); } #endregion }}
3、界面层的一般处理程序,处理一般请求
using System.Web;using Dedeyi.Common;using Dedeyi.ZSF.Model;using Dedeyi.ZSF.BLL;using System;namespace WebApp.Handler{ ////// UserHandler 的摘要说明 /// public class UserHandler : IHttpHandler,System.Web.SessionState.IRequiresSessionState { private HttpContext context; private UserInfoBLL bll =new UserInfoBLL(); public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; //权限检查 // try { string sType = context.Request["reqTypes"]; if (string.IsNullOrEmpty(sType)) { context.Response.Write("参数错误"); return; } this.context = context; switch (sType.ToLower()) { case "add": Add(); break; case "del": Del(); break; case "update": Update(); break; case "search": Search(); break; } } catch (Exception ex) { context.Response.Write(new ReqMsg(false,ex.Message.ToString())); } } ////// 获取用户ID /// ///private int GetUserID() { string s = context.Request["uid"]; return StringHelper.GetInt(s); } /// /// 添加方法 /// private void Add() { UserInfo user=new UserInfo(); int n= RequestHelper.FormToModel(user,context.Request.Form); ReqMsg msg = new ReqMsg(); msg.Success=n>2?bll.Add(user)>0:false; context.Response.Write(msg.ToString()); } /// /// 更新 /// private void Update() { UserInfo user = new UserInfo(); int n = RequestHelper.FormToModel(user, context.Request.Form); ReqMsg msg = new ReqMsg(); msg.Success = n > 2 ? bll.Update(user) : false; context.Response.Write(msg.ToString()); } /// /// 删除 /// private void Del() { int i = GetUserID(); bll.Del(i); ReqMsg msg = new ReqMsg(true, "ok"); context.Response.Write(msg.ToString()); } ////// 查询 /// private void Search() { int index = StringHelper.GetInt(context.Request["page"], 1); int page = StringHelper.GetInt(context.Request["rows"], 10); string s = bll.GetSearchPage(index,page,context.Request.Form); int t = bll.GetSearchCount(context.Request.Form); context.Response.Write(RequestHelper.ResponseGridJSON(s,t)); } public bool IsReusable { get { return false; } } }}
三、EasyUI前台展示
前台方法主要是AJAX处理增删查改请求,创建工具菜单(可能工具权限显示部分但此次不考虑),
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApp.Default" %>
最终显示效果如图:
JS帮助函数:
function ChangeShortDateFormat(cellval) { if (!cellval) return ''; var date = new Date(parseInt(cellval.replace("/Date(", "").replace(")/", ""), 10)); var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1; var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(); var hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(); var minu = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(); var sec = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds(); return date.getFullYear() + "-" + month + "-" + currentDate; //+ " " + hour + ":" + minu + ":" + sec;}//表单序列化有转JSON格式function convertArray(o) { var v = {}; for (var i in o) { if (o[i].name != '__VIEWSTATE') { if (typeof (v[o[i].name]) == 'undefined') v[o[i].name] = o[i].value; else v[o[i].name] += "," + o[i].value; } } return v;}
********谢谢支持,感谢批评建议,努力学习中******************************
Demo 的