天天看點

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

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

1:存儲用json或xml。

2:讀取時還原為MDataTable。

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

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

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

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

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

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

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

進而達到查詢的功能。

現在要支援SQL,看似複雜點又提升了點,因為簡單的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 ...

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

比如:Insert into ErrorLogs(PageUrl , ErrorMessage) values('http://...','what'' is (the (name))...')

把這條語句,分拆出:

1:操作:Insert

2: 表名:ErrorLogs

3:PageUrl :"http://..."

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

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

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

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

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

 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();

            }

        }

上面這段代碼很簡單,執行指定連結的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這個日志說明:

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

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

<add name="LogConn" connectionString="Conn"/> 

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

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

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

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等功能,都是不需要授權可以直接使用的。

     本文轉自cyq1162 51CTO部落格,原文連結:http://blog.51cto.com/cyq1162/1191805,如需轉載請自行聯系原作者