CYQ.Data 数据层框架CYQ.Data 是一款由路过秋天创作的支持多数据库应用[Txt,Xml,Access,MSSQL,Oracle,SQLite,MySql]的底层数据库操作类库,使用本类库可以轻松快速开发项目(QQ群:6033006)。 |
CYQ.Data 数据框架 应用示例 聊天室
快速使用帮助 |
|
|
| #楼主 |
同样为了能一篇介绍完一个示例,我精简挑选了一下,本次的示例为:注册+登陆+在线聊天[省去了私聊部分] 在看此文示例之前,请先看:CYQ.Data 数据框架 应用示例 留言版--因为注册+登陆从那直接Copy的,这节就省过了。
当前环境同样是:VS2005+SQL2005,以下进入正题: 一:数据库 起名:Chat 两个表:Users+Message,上图: 说明:和上一示例比较:Users表是一样的,Message表也几乎一样了。
二:项目初始 1:新建网站项目,如起名叫:Cyq.Data.ChatDemoProject 同样产生webconfig后添加好数据库链接! 2:添加引用:CYQ.Data.dll 3:生成分页查询存储过程与枚举:还是页面:WriteOut.aspx,用于生成输出: 生成分页存储过程新方法:CYQ.Data 轻量数据层之路 华丽升级 V1.3出世(五):[9:OutPutData:增加ExeCreateProc方法用于直接执行生成分页存储过程]
三:项目开始: 先上图,整体项目情况: 1:注册用户(Login.aspx:见示例篇(四)) 2:用户登陆(Reg.aspx:见示例篇(四)) 3:在线聊天:(Default.aspx) 先上图,聊天主界面: 分区域说明: 1:左侧区为聊天显示区 2:右侧上头为欢迎与退出 3:右侧下头为用户列表区 4:底部就是留言区了 5:ajax定时刷新用2.0内置ICallBack接口实现。
下面进行代码解说: 页面进来时,把能加载的都加载完:只有三个点[1:登陆者名称;2:用户列表;3:默认取10条留言显示] 1:登陆者名称与退出事件 void LoadMyInfo() { if (Session["ID"] == null) { Response.Redirect("Login.aspx"); } else { Session["ID"] = Session["ID"]; myID =Convert.ToInt32(Session["ID"]); MAction action = new MAction(TableNames.Users); if (action.Fill(myID)) { action.SetTo(labUserName); } else { labUserName.Text = "读取数据失败!"; } action.Close(); } } protected void btnLogout_Click(object sender, EventArgs e) { Session["ID"] = null; Response.Redirect("Login.aspx"); }
2与3:绑定用户列表与后十条留言 void LoadListInfo() { int rowCount; MAction action = new MAction(TableNames.Users);//加载用户列表 rptUserList.DataSource = action.Select(0,0,"ID<>"+myID,out rowCount); rptUserList.DataBind(); if (action.ResetTable(CustomerSQL.Message))//切换表到留言列表,加载留言列表 { rptMessageList.DataSource = action.Select(1, 10, "", out rowCount); rptMessageList.DataBind(); action.Close(); } }
上面又有一个自定义的CustomerSQL.Message,其实我应该用一下存储过程来演示的,算了,写都写了: 还是和上次演示一下,自定义语句放到类里统一管理了: /// <summary> /// by 路过秋天 http://cyq1162.cnblogs.com/ /// </summary> public class CustomerSQL { public const string Message = "(SELECT m.*,uA.UserName,isnull(uB.UserName,'所有人') AS UserName2 FROM Message m LEFT JOIN Users uA ON m.SendUserID=uA.ID LEFT JOIN Users uB ON m.RecvUserID=uB.ID) v"; }
4:接下来是Ajax部分了 这里我封装了一下,新建了个PageBase类放里面了,看一下PageBase.cs代码: /// <summary> /// 路过秋天 http://cyq1162.cnblogs.com /// </summary> public class PageBase:System.Web.UI.Page,ICallbackEventHandler { #region ICallbackEventHandler 成员 /// <summary> /// Ajax方法时的回调结果 /// </summary> public string ajaxCallBackResult = null; /// <summary> /// 注册Ajax方法 /// 调用方法名:callAjax(arg) /// 回调方法名:callBack(result) /// </summary> public void RegisterAjax() { RegisterAjax(this, "callAjax", "callBack"); } public void RegisterAjax(Control ct, string functionName, string callBackName) { if (!ct.Page.ClientScript.IsClientScriptBlockRegistered(functionName)) { string callBack = ct.Page.ClientScript.GetCallbackEventReference(ct, "arg", callBackName, null); string clientFunction = "function " + functionName + "(arg){" + callBack + "}"; ct.Page.ClientScript.RegisterClientScriptBlock(ct.Page.GetType(), functionName, clientFunction, true); } } public string GetCallbackResult() { return ajaxCallBackResult; } public virtual void RaiseCallbackEvent(string eventArgument) { } public virtual void RegisterCommonScript() { const string script = @"function $(id){return document.getElementById(id)}function $V(id,defaltValue){if($(id)){if(defaltValue && $(id).value.length==0){return defaltValue;} else{return $(id).value;}}return '';}"; Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "GetBy", script, true); } #endregion }
OK,现在看一下Default.aspx的Page_Load里调用一下: public partial class _Default :PageBase { int myID; protected void Page_Load(object sender, EventArgs e) { LoadMyInfo(); LoadListInfo(); RegisterCommonScript(); RegisterAjax(); } //...省略N行代码... }
其实,Ajax只有两部分: 1:点提交时,用户消息要ajax提交到后台入库: 2:用户定时去取消息
关于这两个,我们看一下ICallBack的实现: public override void RaiseCallbackEvent(string eventArgument) { int splitIndex = eventArgument.IndexOf(':'); string cmd = eventArgument.Substring(0, splitIndex); string data = eventArgument.Substring(splitIndex+1); switch (cmd) { case "0"://送发消息 ajaxCallBackResult = "0☆" + Send(data); break; case "1"://查询消息 ajaxCallBackResult = "1☆" + GetMessage(data); break; } } 接收时:该代码和前台html约定好分隔符,这里为“:”号; 返回时:也要约定好分隔符,这里为“☆”号;
接下来就是实现两个函数Send与GetMessage了。 看下Send: string Send(string msg) { int splitIndex=msg.IndexOf(':'); string[] content = msg.Split('☆');//内容为接收者ID☆消息内容 MAction action = new MAction(TableNames.Message); action.Set(Message.SendUserID, myID); action.Set(Message.RecvUserID,msg.Substring(0,splitIndex)); action.Set(Message.Body, msg.Substring(splitIndex+1)); string result = action.Insert() ? "1" : "0"; return result; }
再看下GetMessage: private const string msg = "<div class=\"msg\"><font color=\"Olive\">{0}</font> 对 <font color=\"Olive\">{1}</font> 说 <font color=\"Olive\">{2}</font><br /><p>{3}</p></div>"; string GetMessage(string maxID) { string result=""; MAction action = new MAction(CustomerSQL.Message); if (maxID =="0") { if (action.Fill("1=1 order by id desc"))//取最大ID返回 { result = action.Get<string>(Message.ID)+"☆"; action.Close(); } } else { int rowCount; MDataTable mTable = action.Select(0, 0, string.Format("ID>{0} and SendUserID<>{1} and (RecvUserID=0 or RecvUserID={1})", maxID, myID), out rowCount); action.Close(); if (rowCount > 0) { result = mTable.Rows[rowCount - 1]["ID"].Value + "☆"; foreach (MDataRow row in mTable.Rows) { result += string.Format(msg,row["UserName"].Value, row["UserName2"].Value,row["PubTime"].Value,row["Body"].Value); } } else { result += maxID + "☆"; } } return result; } 代码有点长,似乎不太好理解,因为和前台html界面相关的关系:其实就是组合字符串输出了。
5:前台HTML/JS 发送消息时: //组合成 命令:用户ID:留言内容 callAjax("0:"+$V('hdfUserID')+":"+$('txtBody').innerHTML);
接收消息时: //组合成 命令:最大消息ID callAjax("1:"+msgMaxID);
回调时结果: function callBack(result)
{ var items=result.split('☆'); switch(items[0]) { case "0"://发送消息返回结果 $('btnSend').disabled=false; add($V('hdfBody')); break; case "1"://查询返回结果 if(items.length>1) { msgMaxID=items[1]; } if(items.length>2) { add(items[2]); } break; } } function add(msg) { if(msg) { $('left').innerHTML+=msg; $('left').scrollTop=$('left').scrollHeight;//滚动条定位到最后面 } }
其余具体html代码就不详细贴出来了,因为我知道,我上面代码贴的再详细,估计也没多少人看,大伙看个开头,然后往下拉,看到源码下载,点击下载,差不多就拍拍屁股走人了 示例源码下载: Cyq.Data.ChatDemoProject.rar(下载: ) [数据库创建脚本在App_Data目录下] |
游客[注册][211.160.165.*]2011/5/17 23:53:37 | #2 | |
你的框架优势是啥,和其他免费框架有啥优势和不足,没有比较凭什么买你的 回复: 那你就比较下了。 |
游客[注册][222.91.186.*]2011/4/8 0:46:59 | #1 | |
呵呵,我顶下~ 回复: 谢谢支持! |
发表评论
论坛公告
帖子搜索
最新帖子
最新评论
- 请教博主。我mysql的提示 V5.7.7.4 MySql.xxxx:check the tablename "tbl_site_info" is exist? error:ExeDataReader():Expression #1 of ORDER BY clause is not in SELECT list, references column 'information_schema.s1.ORDINAL_POSITION' which is not in SELECT list; this is incompatible with DISTINCT 配置如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="Conn" connectionString="host=192.168.3.101;Port=3306;Database=xxxxx;uid=root;pwd=2017" providerName="MySql.Data.MySqlClient"/> </connectionStrings> </configuration>
- 查询语句有点问题,软件启动时查询语句可以从数据库查询出数据,软件一直运行时无论怎么修改数据库,查询出来的还是老数据,不知道是为什么
- 我语句中用到了union all而且两个查询都有查询条件,action.select总是不成功,不知道有没有什么好的解决办法,谢谢
- 大神,如果我想通过一个对象(从数据映射过来的)要插入的话,我需要遍历字段然后每个set一下吗?有没有更好的方法??
- 真心好用,想问下秋天直接拼写sql怕注入吗
- V4.5后,好多方法都改变了,求来个新的日志帮助
- 請問大神V5源碼要多少錢 我是和交流過的
- 楼主,,从数据库里查出来并绑定datagridview,但是显示的都是数据库里的英文名,怎么改??好纠结啊这个。。。。
- 我想问一下,主从表添加怎样处理
- 10年就过了!!!!