天天看點

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

對于文本資料庫的原理:簡單的說,就4步:

1:存儲用json或xml。

2:讀取時還原為mdatatable。

3:操作時操作mdatatable實作資料行的變化。

4:儲存時重新寫為json或xml。

ps:當然還有一個codefirst模式時自動産生用于記錄表結構的"表名.ts"檔案。

文本資料庫的where語句分拆: 

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

原先的功能,有select(where),這個where是支援sql語句的,簡單說就是對where進行了以下分析:

string where="id>1 and name like '%a%' order by id desc";

分析出where,order by ,再分析出id,name及對應的值,循環進行值判斷,提取出合适的行。 

進而達到查詢的功能。

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

現在要支援sql,看似複雜點又提升了點,因為簡單的sql語句大體如下:

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

insert into errorlogs(pageurl , errormessage) values('http://...','what'' is the ...')

select count(*) from errorlogs...

select * from errorlogs where ...

select id,name from errorlogs ...

update errorlogs set id=1 and name='name is mr'' right'

delete from errorlogs where ...

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

對于這些字元串的處理,真是很考基本功:

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

比如:insert into errorlogs(pageurl , errormessage) values('http://...','what'' is (the (name))...')

把這條語句,分拆出:

1:操作:insert

2: 表名:errorlogs

3:pageurl :"http://..."

4: errormessage :"'what'' is (the (name))..." 

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

ps:我覺的可以适當的拿來做面試題了。。。。

大體整體的實作,基本上就等同于解析上面的sql文法,然後回歸到mdatatable的原始操作上去,細節就不啰嗦重複了。

下面看一下實作後的效果圖:

項目截圖就省略了,頁面背景的代碼:

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

 protected void btnexec_click(object sender, eventargs e)

        {

            if (!string.isnullorempty(txtsql.text))

            {

                mproc proc = new mproc(txtsql.text, txtconn.text);

                switch (ddlexetype.selectedvalue)

                {

                    case "0":

                        labtip.text = proc.exescalar<string>();

                        break;

                    case "1":

                        labtip.text = proc.exenonquery().tostring();

                    case "2":

                        mdatatable dt = proc.exemdatatable();

                        rptlist.datasource = dt;

                        rptlist.databind();

                }

                proc.close();

            }

        }

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

上面這段代碼很簡單,執行指定連結的sql語句,然後顯示相應的資訊。

操作資料庫,基本配置檔案裡指定日志的連結字元串是必不可少的内容:

<add name="logconn" connectionstring="txt path={0}app_data"/> 

說明:把系統錯誤日志用檔案資料庫記錄,cyq.data v5内置用了codefirst方式來實作異常的資料庫執行日志錯誤:

表名為errorlogs

4個字段分别為:

1:id,pageurl,errormessage,createtime。 

下面我們看界面:由于我的項目裡本身就有日志,我們查詢一下:

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

ok,下面我們删除所有資料庫,執行成功後删除了5行資料:

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

再添加一行資料:

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

 最後更新這行1行資料:

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

 最終再查詢顯示一次:

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

至此,整個基本的sql文法解析和實作就告終了,至于什麼groupby,多表,視圖,函數之類的,就在文本資料庫的能力之外了。

功能的實作自己用兩個table去for還是while去實作自己需要的邏輯。 

下面再補充一下erroglogs這個日志說明:

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

預設的codefirst,簡單說就是你指定哪種資料庫類型,就會自動建立相應的表結構,然後把執行sql的錯誤資訊寫到該日志裡,友善查詢分析和解決。

以前,我習慣把日志的連結寫成:

<add name="logconn" connectionstring="conn"/> 

其實就是指向conn(cyq.data預設的主資料庫配置頂),這樣就把日志表放到和主資料庫表同一個資料庫。。

結果有時候,如果主資料庫挂掉,異常日志就無法記錄了,是以建議是存到其它資料庫。

但有了檔案資料庫之後,用文本來存儲日志,看似是個不錯的選擇,而且操作也相當友善。

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

codefirst時,如果有資料(第一條資料産生時,自動根據實體産生了表結構,如果是文本,在指定的目錄下出來這個)

CYQ.Data V5 文本資料庫支援SQL語句操作(實作原了解說)

當然了,除了比較标準的,是自動生成的,如果你是自己手工建立,可以建立一個表名.ts表結構,内容:

id,int;

pageurl,string;

errormessage,string;

createtime,datetime; 

cyq.data v5裡文本資料庫,實用價值:

包括網站站點的廣告節點顯示,友情連結,一些需要經常或偶爾編輯的key,value值等項,存文本資料庫是最友善不過了。

有效的把非主站的附加資料,存儲到文本資料庫,利用文本資料完全記憶體表機制,高效,節能,又友善。

cyq.data v5在文本資料庫、access、sqlite、xhtmlaction等功能,都是不需要授權可以直接使用的。

版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:

http://www.cnblogs.com/cyq1162/archive/2013/05/02/3055049.html