在 開源中的靈感之源 的blog上看到這篇文章 開源純C#輕量級資料庫引擎:SharpHSQL 1.0.3.0版本 這篇文章,著實幸福了一陣。
類似的資料庫引擎我用過不少,比如 sqlite 、MINOSSE 等。sqlite是純c在web應用中不方便,minnosse就根本沒有辦法正常運行。
我尋找 這樣的資料庫引擎 最主要的原因是 想在web項目中替代ACCESS,減少網站建設費用和提高網站效能。
首先我將SharpHsql 跟SQL Server 2000 進行比較 其中建立表和刪除表的資料 Hsql領先。修改、查詢資料速度基本上持平,查詢時SharpHsql要慢一點(很小的一點),SharpHsql的查詢同樣使用了緩衝技術。
插入資料的時候隨表中資料增加而速度越慢,在1萬行資料時時間增加減緩,這個速度大大慢於SQL server;
我以前做測試access 的資料基本上是 SQL server 的1/10,所以SharpHsql的速度相對於Access還是很有優勢的,綜合比較基本是ACCESS 六倍以上的效能。
SharpHsql 的資料庫一共是 4 個檔案 *.data 、*.cfg 、*.log 、 *.backup ;看尾碼大家就知道幹什麼的,我就不多說了
我們來看看他支援的功能,我這裡摘錄一段代碼,大家看了代碼就明白
switch(sToken)
{
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的時候 他的 DataReader沒有實現索引器,只能用 DataReader[ Columnname ] 的方式 和DataReader.GetInt32(0) 這樣的方式實現。需要注意的是 DataReader[ Columnname ] 中的 列名稱需使用大寫,在系統裡面名稱這些全部是SharpHsql全部是大寫處理的;
DataReader[ Columnname ] 這種方式是使用 HashTable 實現,DataReader.GetInt32(0) 是使用 object[]實現。
在使用SharpHsqlDataAdapter 的時候,會發現 非SharpHsqlDataAdapter .Fill(dataset)這樣的形式會報錯,比如SharpHsqlDataAdapter .Fill(dataset,tablename );這個問題好辦只要刪除 SharpHsqlDataAdapter.cs中的Fill方法就可以了,實際上他不需要重寫。 public override int Fill(DataSet dataSet)
{
return base.Fill( dataSet );
}
我發現的問題暫時就這些,我已經喜歡上它了。
對了,他的log4net系統實在佔用空間,我把它去除了!
總的來說資料庫引擎還是比較完善,只是 驅動寫的比較馬虎 ,還有就是 資料對象名稱 這些不應該全部換成大寫。