第一次接触 SharpHsql(纯C#开源数据库引擎)
?????
????????? 在 開(kāi)源中的靈感之源 的blog上看到這篇文章?開(kāi)源純C#輕量級(jí)數(shù)據(jù)庫(kù)引擎:SharpHSQL 1.0.3.0版本 這篇文章,著實(shí)幸福了一陣。
????? 類(lèi)似的數(shù)據(jù)庫(kù)引擎我用過(guò)不少,比如 sqlite 、MINOSSE?等。sqlite是純c在web應(yīng)用中不方便,minnosse就根本沒(méi)有辦法正常運(yùn)行。
????? 我尋找 這樣的數(shù)據(jù)庫(kù)引擎 最主要的原因是 想在web項(xiàng)目中替代ACCESS,減少網(wǎng)站建設(shè)費(fèi)用和提高網(wǎng)站性能。
????? 首先我將SharpHsql 跟SQL Server 2000 進(jìn)行比較 其中創(chuàng)建表和刪除表的數(shù)據(jù) Hsql領(lǐng)先。修改、查詢數(shù)據(jù)速度基本上持平,查詢時(shí)SharpHsql要慢一點(diǎn)(很小的一點(diǎn)),SharpHsql的查詢同樣使用了緩存技術(shù)。
???? 插入數(shù)據(jù)的時(shí)候隨表中數(shù)據(jù)增加而速度越慢,在1萬(wàn)行數(shù)據(jù)時(shí)時(shí)間增加減緩,這個(gè)速度大大慢于SQL server;
???? 我以前做測(cè)試access 的數(shù)據(jù)基本上是 SQL server 的1/10,所以SharpHsql的速度相對(duì)于Access還是很有優(yōu)勢(shì)的,綜合比較基本是ACCESS 六倍以上的性能。
???
???? SharpHsql 的數(shù)據(jù)庫(kù)一共是?4 個(gè)文件 ?*.data 、*.cfg 、*.log 、 *.backup ;看后綴大家就知道干什么的,我就不多說(shuō)了
???? 我們來(lái)看看他支持的功能,我這里摘錄一段代碼,大家看了代碼就明白??????
???
????????????????????{
????????????????????????case?"SELECT":
?????????????????????????????rResult?=?p.ProcessSelect();
????????????????????????????break;
????????????????????????case?"INSERT":
????????????????????????????rResult?=?p.ProcessInsert();
????????????????????????????break;
????????????????????????case?"UPDATE":
????????????????????????????rResult?=?p.ProcessUpdate();
????????????????????????????break;
????????????????????????case?"DELETE":
????????????????????????????rResult?=?p.ProcessDelete();
????????????????????????????break;
????????????????????????case?"ALTER":
????????????????????????????rResult=p.ProcessAlter();
????????????????????????????break;
????????????????????????case?"CREATE":
????????????????????????????rResult?=?ProcessCreate(c,?channel);
????????????????????????????script?=?true;
????????????????????????????break;
????????????????????????case?"DROP":
????????????????????????????rResult?=?ProcessDrop(c,?channel);
????????????????????????????script?=?true;
????????????????????????????break;
????????????????????????case?"GRANT":
????????????????????????????rResult?=?ProcessGrantOrRevoke(c,?channel,?true);
????????????????????????????script?=?true;
????????????????????????????break;
????????????????????????case?"REVOKE":
????????????????????????????rResult?=?ProcessGrantOrRevoke(c,?channel,?false);
????????????????????????????script?=?true;
????????????????????????????break;
????????????????????????case?"CONNECT":
????????????????????????????rResult?=?ProcessConnect(c,?channel);
????????????????????????????break;
????????????????????????case?"DISCONNECT":
????????????????????????????rResult?=?ProcessDisconnect(c,?channel);
????????????????????????????break;
????????????????????????case?"SET":
????????????????????????????rResult?=?ProcessSet(c,?channel);
????????????????????????????script?=?true;
????????????????????????????break;
????????????????????????case?"SCRIPT":
????????????????????????????rResult?=?ProcessScript(c,?channel);
????????????????????????????break;
????????????????????????case?"COMMIT":
????????????????????????????rResult?=?ProcessCommit(c,?channel);
????????????????????????????script?=?true;
????????????????????????????break;
????????????????????????case?"ROLLBACK":
????????????????????????????rResult?=?ProcessRollback(c,?channel);
????????????????????????????script?=?true;
????????????????????????????break;
????????????????????????case?"SHUTDOWN":
????????????????????????????rResult?=?ProcessShutdown(c,?channel);
????????????????????????????break;
????????????????????????case?"CHECKPOINT":
????????????????????????????rResult?=?ProcessCheckpoint(channel);
????????????????????????????break;
????????????????????????case?"CALL":
????????????????????????????rResult?=?p.ProcessCall();
????????????????????????????break;
????????????????????????case?"SHOW":
????????????????????????????rResult?=?ProcessShow(c,channel);
????????????????????????????break;
????????????????????????case?"DECLARE":
????????????????????????????rResult?=?p.ProcessDeclare();
????????????????????????????script?=?true;
????????????????????????????break;
????????????????????????case?";":
????????????????????????????continue;
????????????????????????default:
????????????????????????????throw?Trace.Error(Trace.UnexpectedToken,?sToken);
????????????????????}
???? 然后在DataReader的時(shí)候 他的 DataReader沒(méi)有實(shí)現(xiàn)索引器,只能用 DataReader[? Columnname ] 的方式 和DataReader.GetInt32(0) 這樣的方式實(shí)現(xiàn)。需要注意的是? DataReader[? Columnname ]? 中的 列名稱需使用大寫(xiě),在系統(tǒng)里面名稱這些全部是SharpHsql全部是大寫(xiě)處理的;
??? DataReader[? Columnname ] 這種方式是使用 HashTable 實(shí)現(xiàn),DataReader.GetInt32(0) 是使用 object[]實(shí)現(xiàn)。
?
? 在使用SharpHsqlDataAdapter 的時(shí)候,會(huì)發(fā)現(xiàn) 非SharpHsqlDataAdapter?.Fill(dataset)這樣的形式會(huì)報(bào)錯(cuò),比如SharpHsqlDataAdapter?.Fill(dataset,tablename?);這個(gè)問(wèn)題好辦只要?jiǎng)h除? SharpHsqlDataAdapter.cs中的Fill方法就可以了,實(shí)際上他不需要重寫(xiě)。
????????{
????????????return?base.Fill(?dataSet?);
????????}
?? 我發(fā)現(xiàn)的問(wèn)題暫時(shí)就這些,我已經(jīng)喜歡上它了。
?? 對(duì)了,他的log4net系統(tǒng)實(shí)在占用空間,我把它去除了!
總的來(lái)說(shuō)數(shù)據(jù)庫(kù)引擎還是比較完善,只是 驅(qū)動(dòng)寫(xiě)的比較馬虎 ,還有就是 數(shù)據(jù)對(duì)象名稱 這些不應(yīng)該全部換成大寫(xiě)。
?
?
?程序猿們,我也跟風(fēng)開(kāi)了網(wǎng)店,主要經(jīng)營(yíng)土特產(chǎn),云南核桃,四川正宗土雞蛋。有需要的就支持一下小店哈 ?七彩山川美食(http://qcsc.taobao.com)?
?
轉(zhuǎn)載于:https://www.cnblogs.com/leiyu1980/archive/2005/08/10/211504.html
總結(jié)
以上是生活随笔為你收集整理的第一次接触 SharpHsql(纯C#开源数据库引擎)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 忍不住也谈招聘应聘程序员的事
- 下一篇: Hibernate 多对多映射实列