没事儿时,就用C#写了一个免配置的DB访问组件。基本结构是这样的----------------------------------------------
public interface IDBEngine
{
/// 保存数据
int insert(Object pojo) ;/// 更新数据
int update(Object pojo);/// 删除数据
int delete(Object pojo);
/// 提取结果集
ArrayList select(Object pojo);/// 提取结果集到DataTable
DataTable selectIntoDataTable(Object pojo);/// 提取结果集
ArrayList select(Object pojo, Pagination pagination);/// 提取连接 
OleDbConnection getConnection();/// 打开事务
void beginTrans();/// 提交
void commit();/// 回滚
void rollback();/// 执行单条SQL
void executeSQL(String SQL);/// 带返回执行存储过程语句
ArrayList executeProcedureCall(String SQL, Object[] param, Object voclass);/// 不带返回执行存储过程语句
void executeProcedureCall(String SQL, Object[] param);int getInt(string SQL);int getColumnMaxValue(string TableName, string ColumnName);DataTable executeSqlProcedureCall(String SQL, object[] param);/// 执行一条SQL语句,将返回记录集放入POJO并返回POJO列表
ArrayList SelectFromSQL(string SQL, object pojo);/// 执行一条SQL语句,将返回记录集放入POJO并返回POJO列表,同时分页
ArrayList SelectFromSQL(string SQL, object pojo, Pagination pagination);/// 注销对象
void Release();/// 得到当前事务状态
int getTransStates();/// 得到数据库类型
string getDBType();/// 得到数据库当前时间
string getDBDateTime();----------------------------------所有的实体bean都要与对应的数据库表同名,字段名列名就是加get\set
并且必须要继承以下类
public class BasePojo
{//设置查询条件
public void setCondtion(Condtion c)//获取查询条件
public Condtion getCondtion()
//设置排序
public void setOrderBy_DESC(string FiledName)
public void setOrderBy_ASC(string FiledName)
public string getOrderBy()-----------------------------------我在写这个之前看了speedframework的结构,也没有太仔细看,糊里糊涂的就写了这个组件目前我看到的缺点:1、没有自主的分页功能,要依靠数据库里的一个分页存储过程(我自己也感觉这样比较垃圾,而且我只写了oracle和mssql下的分页存储过程)2、没有cache3、没有connection pool,主要是因为MS的驱动里自带了。4、实体类完全反映了数据库中的表或视图的结构。------------------------
以下有我调用时的一些示例public int CancelAssignedSalePlanCollect(SalePlan.v_SalePlan_Collect sale_plan)
        {
            Engine db = Engine.getInstance();            try
            {
                
                //检查计划是否已经审核
                string SQL = "SELECT count(*) FROM T_ProducePlan WHERE stat != 1 AND collect_id = " + sale_plan.getId();
                if (db.getInt(SQL) > 0)
                {
                    //计划已经审核,无法取消
                    db.Release();
                    return 0;
                }                db.beginTrans();                //删除相关计划
                T_ProducePlan produce_plan = new T_ProducePlan();
                produce_plan.setCondtion(new Condtion(" and collect_id = " + sale_plan.getId()));
                
                this.Remove(produce_plan, db);                WriteLog(Config.BaseInfo.getInstance().LogString_Remove, "[删除生产计划] 删除所有汇总ID是“" + sale_plan.getId() + "”生产计划");
                
                //将原销售计划汇总更新状态成“未分配”
                SalePlan.SalePlanManager spm = new SalePlan.SalePlanManager(db);
                SalePlan.v_SalePlan_Collect pln = new SalePlan.v_SalePlan_Collect();
                pln.setStat("1");
                pln.setCondtion(new CSDN.DBQuery.Condtion(" and id = " + sale_plan.getId()));
                spm.modifyCollectSalePlan(pln, db);                WriteLog(Config.BaseInfo.getInstance().LogString_Modify, "[修改市场需求汇总] 修改ID是" + sale_plan.getId() + "的市场需求汇总,其状态更改为“未分配”");                db.commit();                db.Release();                return 1;
            }
            catch (Exception ex)
            {
                if (db.getTransStates() == 1)
                {
                    db.rollback();
                }
                Utils.LogWriter.Error("取消一个销售计划汇总所分配的生产计划时出错:" + ex.Message);
                return -1;
            }        }-------------------------------------
想请高手给我指点一下,这个组件在设计结构上都有哪些缺陷,我应该怎么要改进它。只管说,我知道和Hibernate比,它一无是处

解决方案 »

  1.   


    直接用sqlhelper楼上正解这种东西本来就不存在答案,你认为好用就行了
      

  2.   

    感觉sqlhelper不能直接查询返回实体类,还得自己手工get/set
      

  3.   

    yuwenge(活得痛快) 说的好!每个人都有自己的思路!
      

  4.   

    SqlHelper 结合 反射吧!
      

  5.   

    呵呵,俺现在也正在开发这方面的东东,不过我觉得你既然传进去的是实体参数。那么返回值最好也是实体对象(或实体对象集合),不要返回什么DataTable,DataReader之类的东西。参数最好不要什么SQL语句之类的东西,最好写一套对实体对象查询的语法。然后解析成SQL语句。这样才是真正的ORM框架
      

  6.   

    to:tigerlgf(南湖学士)就像你说的
    /// 保存数据
    int insert(Object pojo) ;/// 更新数据
    int update(Object pojo);/// 删除数据
    int delete(Object pojo);
    /// 提取结果集
    ArrayList select(Object pojo);/// 提取结果集(按分页)
    ArrayList select(Object pojo, Pagination pagination);我是这样做的,不过考虑到特殊情况下使用了比较复杂的,我没有在SqlGeneral里实现的SQL,所以加了一下的方法:-----------------------/// 执行一条SQL语句,将返回记录集放入POJO并返回POJO列表
    ArrayList SelectFromSQL(string SQL, object pojo);/// 执行一条SQL语句,将返回记录集放入POJO并返回POJO列表,同时分页
    ArrayList SelectFromSQL(string SQL, object pojo, Pagination pagination);又想到了可能有人喜欢用Datatable,所以加了:/// 提取结果集到DataTable
    DataTable selectIntoDataTable(Object pojo);---------------------------但就像你说的,以上这些方法的确是不应该加上的,它们让这个东西看起来不伦不类了!但要实现比较复杂的sql的话,除非定义一个自己的查询语言,就像HQL或DLINQ那样的,除此之外我还没想出有什么好办法,你是怎么做的呢?
      

  7.   

    我的SQL语句是自动生成的。查询的方法我利用了泛型。
    如果有兴趣,我们可以私聊。我正在ORM方面的框架。也碰了你上面的一些问题,对单关键字分页好做,但是多关键字分页不好处理。
      

  8.   

    TO:tigerlgf(南湖学士)真是很抱歉!我很久没有关注这个贴,如果您方便,请加我的MSN:[email protected]这个小框架我已经有一段时候没有升级了,感觉有点无从下手。很希望能听听您的意见!PS:分页功能是我做的比较垃圾的地方/// 提取结果集
    ArrayList select(Object pojo, Pagination pagination);我把分页信息传递进来,就调用存储过程来做了,和框架是分开的!这有点不符合ORM,不过速度比较快,此外也是因为我没有太好的办法,由于太懒,Hibernate的分页方式我都没有研究过,但以前研究过Apache的一个分页标签,叫做displaytag!
      

  9.   

    个人建议,不要把Sql语句和对象混在一起,也不要既有返回DataTable,又有返回ArrayList的。
    分页和缓存也不能算是缺点,因为很难做到通用。大部分情况下,ORM主要作用是减少代码量和规范接口,不可能做到全能的。
      

  10.   

    感谢danjiewu(阿丹)我也认为datatable的方法不恰当,我在下个版本里已经删除了它。仁兄认为还有哪些接口定义的有问题?请直言
      

  11.   

    NHibernat也很垃圾,SQL Helper则是垃圾中的垃圾。
      

  12.   

    Ivony(授人以鱼不如授人以渔,上海谋生) ( )
    请给一个正解光说不练假把式呵呵。小弟C#新手。
      

  13.   

    TO:Ivony(授人以鱼不如授人以渔,上海谋生) 我没用过NHibernat,不过我用过JAVA下的Hibernat,感觉还不错呀,大概看了一下它的结构,甚至很崇拜其作者,只是我以前用的是Eclipse,在配置Oracle时很垃圾,不过那应该是插件的问题。后来我看过它生成的一些sql,做一个删除操作时生成了N条delete语句,每条delete只删除一行,感觉有点汗,但我认为作者应该是在ORM与性能之间选择了ORM(当然,对ORM可能每个人理解会有分歧)。但我认为它还应该是个orm里最好的框架了。如果NHibernat和Hibernat结构是一样的话,那也应该是个出色的框架了,仁兄为什么认为它很垃圾呢?
      

  14.   

    TO:Ivony(授人以鱼不如授人以渔,上海谋生) 仁兄说的很对,不过为什么您认为Hibernat的设计不是精巧的?哪些地方设计得冗长或多余?我看了解一些Hibernat的设计,愚认为都是做为一个持久层其设计是原始而简单的,但站在对多种数据库的兼容的角度来说,实在是太精妙了!
      

  15.   

    事实上我到现在也还没看到一个Simple的ORM,所以都不够精巧。至于精妙,那只不过是你还没看到更精妙的。
      

  16.   

    Ivony(授人以鱼不如授人以渔,上海谋生)看来真是山外有山,在您看来LINQ已经是精巧了,您才是世外高人啊!您已经站到山外了!
      

  17.   

    做orm的,建议看看http://www.macrobject.com这个网站,这个公司有套ORM相当不错,可以下下来试用,参考参考。