CYQ.Data V5版本的文本數據庫,以前有過相關的介紹:周末一起用文本數據庫玩玩Code First
數據的存儲,是基於json格式或xml格式的,而實現的原理,也有一篇介紹: CYQ.Data V5文本數據庫技術原理解密
前幾天實現基本功能后,也寫了一篇突發想支持SQL語句的沖突想法的來源: CYQ.Data 文本數據庫解析SQL語法
對於文本數據庫的原理:簡單的說,就4步:
2:讀取時還原為MDataTable。
3:操作時操作MDataTable實現數據行的變化。
4:保存時重新寫為json或xml。
PS:當然還有一個CodeFirst模式時自動產生用於記錄表結構的"表名.ts"文件。
文本數據庫的Where語句分拆:
string where= " id>1 and name like '%a%' order by id desc ";
分析出where,order by ,再分析出id,name及對應的值,循環進行值判斷,提取出合適的行。
從而達到查詢的功能。
現在要支持SQL,看似復雜點又提升了點,因為簡單的SQL語句大體如下:
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 ...
對於這些字符串的處理,真是很考基本功:
把這條語句,分拆出:
1:操作:Insert
2: 表名:ErrorLogs
3:PageUrl : " http://... "
4: ErrorMessage : " 'what'' is (the (name))... "
PS:我覺的可以適當的拿來做面試題了。。。。
大體整體的實現,基本上就等同於解析上面的SQL語法,然后回歸到MDataTable的原始操作上去,細節就不啰嗦重復了。
下面看一下實現后的效果圖:
項目截圖就省略了,頁面后台的代碼:
{
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方式來實現異常的數據庫執行日志錯誤:
4個字段分別為:
1:ID,PageUrl,ErrorMessage,CreateTime。
下面我們看界面:由於我的項目里本身就有日志,我們查詢一下:
OK,下面我們刪除所有數據庫,執行成功后刪除了5行數據:
再添加一行數據:
最后更新這行1行數據:
最終再查詢顯示一次:
至此,整個基本的SQL語法解析和實現就告終了,至於什么GroupBy,多表,視圖,函數之類的,就在文本數據庫的能力之外了。
功能的實現自己用兩個Table去For還是while去實現自己需要的邏輯。
下面再補充一下ErrogLogs這個日志說明:
以前,我習慣把日志的鏈接寫成:
<add name= " LogConn " connectionString= " Conn "/>
其實就是指向Conn(CYQ.Data默認的主數據庫配置頂),這樣就把日志表放到和主數據庫表同一個數據庫。。
結果有時候,如果主數據庫掛掉,異常日志就無法記錄了,所以建議是存到其它數據庫。
但有了文件數據庫之后,用文本來存儲日志,看似是個不錯的選擇,而且操作也相當方便。
CodeFirst時,如果有數據(第一條數據產生時,自動根據實體產生了表結構,如果是文本,在指定的目錄下出來這個)
當然了,除了比較標准的,是自動生成的,如果你是自己手工創建,可以新建一個表名.ts表結構,內容:
PageUrl, string;
ErrorMessage, string;
CreateTime,datetime;
CYQ.Data V5里文本數據庫,實用價值:
有效的把非主站的附加數據,存儲到文本數據庫,利用文本數據完全內存表機制,高效,節能,又方便。
CYQ.Data V5在文本數據庫、Access、SQLite、XHtmlAction等功能,都是不需要授權可以直接使用的。