QBlog

This blog will record the growth associated with the Autumn Garden distance and the history of the development progress and other relevant circumstances
Bulletin
Welcome to Autumn Garden official blog, please: download and use CYQBlog system, and make your comments and Recommendations.
Article Archive
Article
爱说说技术原理:与TXT交互及MDataTable对Json的功能扩展
2011/4/24 1:11:58

关于爱说说在技术选型的文章见:爱说说技术原理方案的定选思考过程

本篇将讲述“爱说说”比较重大的技术问题点及解决手段:

爱说说:http://speak.cyqdata.com/

杂说几句:

一开始,原本是打算在秋式开源团队找一JS人才来引导前台页面的呈现的,毕竟本人在JS还停留在原始的编码阶段,于是当时聊了一下。

再后来,接下来几天,由于秋式开源团队内部管理上有点小调整,还有新开任务小组的事,连续忙了几天,“爱说说”就也停了几天。

几天过后,回到群里Call人,发现原来JS的人才一去无踪影了,没法只好自己动手了。

在定好技术方案后,下面开始技术的分析:

爱说说”的逻辑:

前端html-》发送ajax请求-》后端ashx处理并返回Json-》前端接收Json并解析显示

从后端Ashx说起:

一:TXT文本交互的技术解析

1:数据写入:每次往文本的最后面写一条Json数据,语句很简单:

        public void AppendText(string appendText)
        {
            File.AppendAllText(FilePath, appendText);
        }

利用System.IO.File类即可轻松处理。

2:数据读取:内存表缓存失效时,需要重新加载TXT文本的Json数据,语句也很简单:

        public string LoadText()
        {
            return File.ReadAllText(FilePath);
        }

还是一行代码,处理简单。

3:删除功能:需要移除TXT文本内的某行Json数据,也很容易的说:

        public void RemoveText(string removeText)
        {
            File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
        }

还是一行的说,读完替换,然后重新写入。

OK,和IO的交互设计,相当的简洁,也就这三个函数了,写,读,删除。

 

二:Json的交互的技术解析

1:数据如何写入:

从上面的分析上看,提交肯定是一行一行的数据,于是每次写入都是一条Json语句。

2:功能冲突:这和CYQ.Data.Table下的MDataTable的功能有什么冲突?

MDataTable有ToJson功能,也有LoadFromJson功能,能把数据表转成Json,也能从Json解析还原成内存表。

那数据行有没有ToJson功能?答案,没有!

替换方案可有?答案,有! 可以MDataRow.ToTable().ToJson(),即转成表格再输出Json,看似挺好。

在好之前,看一下MDataTable的ToJson()输出什么?

{"count":"2","error":"","success":"true","data":[
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"},
{"ID":"1","ParentID":"-1","UserID":"1","NickName":"dddd","Body":"aaaaa","CreatedOn":"2011-4-24 1:19:37"}]}

格式就是这个了,前面是一些共有属性,data内才是数据行。

如果每次把这样的数据写完文本,到时候读取解析还原成表格,肯定有问题。

3:如何解决冲突:扩展功能,为单独的数据行添加ToJson()功能

只单独输出:

{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"}

这样子,重复的往后写,感觉就省了点字节,而且也清爽秀多。

4:扩展再扩展:MDataTable.LoadFromJson要支持上

不过这么重复的写单行Json数据,再读取,MDataTable是解析不了的,咋整?

解析不了就扩展一下,把它解析了,由于CYQ.Data的Json,都是本人手动写的解析。

所以,修改来解析这样一行一行的数据,还是可以处理的。三改两改就支持上了,一切很好。

现状就是可以往TXT里写出这么一系列的文本了:

{"ID":"1","ParentID":"-1","UserID":"1","NickName":"小样...","Body":"爱说说...有话就说",第一个哟哟","CreatedOn":"4/20/2011 8:35:10 AM"}

{"ID":"2","ParentID":"-1","UserID":"2","NickName":"路过秋天","Body":"不知道怎么回事说,随便来几字,明字何期多。","CreatedOn":"4/20/2011 8:37:35 AM"}

再然后就是MDataTable.LoadFromjson又可以从这种格式还原成内存表了。

技术手段到了这里,光明灿烂了。

一切流程很好:

1:客户端提交数据-》

2:Ashx提交数据-》写入内存表,然后把数据行ToJson写入文本。

3:内存表在内存,总有失效的时候,失效时LoadFromJson又还原成表格,又继续。

5:另一个重大的技术问题

一切看似很好,可是后面还是会有些问题呢的,什么问题?往下看:

看一下表格的原始属性:

内在表定义:        private static MDataTable _Table = null;//内存数据表

表格的基本列:

                        _Table.Columns.Add("ID", SqlDbType.Int);//ID标识
                        _Table.Columns.Add("ParentID", SqlDbType.Int);//>0说明是回贴
                        _Table.Columns.Add("UserID", SqlDbType.Int);
                        _Table.Columns.Add("NickName", SqlDbType.NVarChar);
                        _Table.Columns.Add("Body", SqlDbType.NVarChar);//内容
                        _Table.Columns.Add("CreatedOn", SqlDbType.DateTime);//创建日期

问题:

在开始定义前,都是有不同的类型的,但如果内在表失效时,重新还原又是什么状况?

由于Json全是字符串,在还原为内存表MDataTable时,默认全都置为SqlDbType.NVarChar,

于是表格的字段类型全变字符串了,如果只是还原后用于绑定显示就没啥问题了,如果此表格还需要进行一些复杂判断比较,就比较纠结了。

正如我要查询ID>数字的行,全是字符串就真的很纠结。

如何解决?

想法一:有想法不是办法:

开始纠结还原后的数据类型问题,通过判断第一行Json的文本值,来定义设置字段类型,比如:

检测值是数字型:就Int。

检测值是日期型:就DateTime

最后就默认给:NVarChar

为何不是办法?

看似挺好,如果文本字段内容第一行是数字,其它行又是字符串呢?后面的内容不就纠结了?

想法二:有想法也是办法:

既然首行取值判断不行,如果首行存表架构呢?

首行Json字段架构如下:

{"ID":"System.Int32","ParentID":"System.Int32","UserID":"System.Int32","NickName":"System.String","Body":"System.String","CreatedOn":"System.DateTime"}

于是,解析时,就可以准确的还原了,那如何输出这行架构行?

于是,MDataColumn也多了个ToJson功能,用于输出表架构,至此,Json的交互方面,也大功告成了!

三:总结

解决了这两个重大的技术难题,接下来的,还有没有其它技术问题?

有,查询功能,即将扩展的MDataTable.Select(......)功能。

还有没有?

大的没了,还有就是技术细节问题了,如:接收参数,定义文本路径,定义最大行ID等。

下节解说,敬请期待。

关注点:MDataTable在“爱说说”扩展了这么多强劲的功能,啥时候发布?

很快,可能是五一前后:会在 CYQ.Data V4.5正式版中集成,也敬请期待与关注。

Autumn Garden is QBlog the official site, created by the passing autumn, based on the framework data layers developed cyqdata support multi-user, multi-language, multi-database (access, mssql, oracle), directory level url and other powerful blog system
:Register
  
Copyright © 2010-2020 power by CYQ.Blog - Autumn v2.0 All Rights Reserved