第一次接触 SharpHsql(纯C#开源数据库引擎)

     
          在 开源中的灵感之源 的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系统实在占用空间,我把它去除了!

总的来说数据库引擎还是比较完善,只是 驱动写的比较马虎 ,还有就是 数据对象名称 这些不应该全部换成大写。

 

 

 程序猿们,我也跟风开了网店,主要经营土特产,云南核桃,四川正宗土鸡蛋。有需要的就支持一下小店哈  七彩山川美食(http://qcsc.taobao.com) 

 

转载于:https://www.cnblogs.com/leiyu1980/archive/2005/08/10/211504.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值