CYQ.Data V5 文本數據庫支持SQL語句操作(實現原理解說)


CYQ.Data V5版本的文本數據庫,以前有過相關的介紹:周末一起用文本數據庫玩玩Code First

數據的存儲,是基於json格式或xml格式的,而實現的原理,也有一篇介紹: CYQ.Data V5文本數據庫技術原理解密

前幾天實現基本功能后,也寫了一篇突發想支持SQL語句的沖突想法的來源: CYQ.Data 文本數據庫解析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();
                         break;
                     case  " 2 ":
                        MDataTable dt = proc.ExeMDataTable();
                        rptList.DataSource = dt;
                        rptList.DataBind();
                         break;
                }
                proc.Close();
            }
        }

 

上面這段代碼很簡單,執行指定鏈接的SQL語句,然后顯示相應的信息。

 

操作數據庫,基本配置文件里指定日志的鏈接字符串是必不可少的內容:

<add name="LogConn" connectionString="txt path={0}App_Data"/> 

 

說明:把系統錯誤日志用文件數據庫記錄,CYQ.Data V5內置用了CodeFirst方式來實現異常的數據庫執行日志錯誤:

表名為ErrorLogs
4個字段分別為:
1:ID,PageUrl,ErrorMessage,CreateTime。 

 

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

 

OK,下面我們刪除所有數據庫,執行成功后刪除了5行數據:

再添加一行數據:

 最后更新這行1行數據:

 

 最終再查詢顯示一次:

 

 

至此,整個基本的SQL語法解析和實現就告終了,至於什么GroupBy,多表,視圖,函數之類的,就在文本數據庫的能力之外了。

功能的實現自己用兩個Table去For還是while去實現自己需要的邏輯。 

 

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

默認的CodeFirst,簡單說就是你指定哪種數據庫類型,就會自動創建相應的表結構,然后把執行SQL的錯誤信息寫到該日志里,方便查詢分析和解決。
以前,我習慣把日志的鏈接寫成:
<add name= " LogConn " connectionString= " Conn "/> 
其實就是指向Conn(CYQ.Data默認的主數據庫配置頂),這樣就把日志表放到和主數據庫表同一個數據庫。。
結果有時候,如果主數據庫掛掉,異常日志就無法記錄了,所以建議是存到其它數據庫。
但有了文件數據庫之后,用文本來存儲日志,看似是個不錯的選擇,而且操作也相當方便。

 

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

 

當然了,除了比較標准的,是自動生成的,如果你是自己手工創建,可以新建一個表名.ts表結構,內容:

 

ID, int;
PageUrl, string;
ErrorMessage, string;
CreateTime,datetime; 

 

 

CYQ.Data V5里文本數據庫,實用價值:

 

包括網站站點的廣告節點顯示,友情鏈接,一些需要經常或偶爾編輯的Key,Value值等項,存文本數據庫是最方便不過了。
有效的把非主站的附加數據,存儲到文本數據庫,利用文本數據完全內存表機制,高效,節能,又方便。

 

 

CYQ.Data V5在文本數據庫、Access、SQLite、XHtmlAction等功能,都是不需要授權可以直接使用的。

 

下載地址: http://www.cyqdata.com/download/article-detail-426


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM