zoukankan      html  css  js  c++  java
  • ORM工具

    http://www.cnblogs.com/zhoutk/archive/2013/01/09/2852160.html

    最近在看反射,突然想写一个ORM工具,要轻量级的,不要配置文档,先不管效率,就是一个小工具,在项目初期方便挂数据库。

    我的目标就是在数据库中建个表,在项目中写个模型,然后用上这个ORM工具,就能实现数据库的基本增删改查。

    有想法就动手做,翠花上代码:


    public bool Insert(object entity)
            {
                Type t = entity.GetType();
                PropertyInfo[] properties = t.GetProperties();
    
                if (properties.Count<PropertyInfo>() > 1)                //至少两个字段,一个主键,一个数据字段。
                {
                    string sql = "Insert into " + t.Name;       //约定:类名即为数据表名。
                    string fieldList = "";
                    string fieldVals = "";
    
                    foreach (PropertyInfo field in properties)
                    {
                        if (field.Name.CompareTo("Id") == 0)        //约定:字段名若为Id,必为主键,且自动增长。
                            continue;
                        switch (field.PropertyType.Name)            //约定:属性名即为数据字段名。
                        {
                            case "String":
                            case "DateTime":
                                fieldList += field.Name + ",";
                                fieldVals += "'" + field.GetValue(entity, null) + "',";
                                break;
                            case "Int32":
                            case "Double":
                                fieldList += field.Name + ",";
                                fieldVals += field.GetValue(entity, null) + ",";
                                break;
                            case "Boolean":
                                fieldList += field.Name + ",";
                                fieldVals += ((bool)field.GetValue(entity, null) ? 1 : 0) + ",";
                                break;
                            default:
                                break;
                        }
                    }
                    fieldList = fieldList.Remove(fieldList.Length - 1);
                    fieldVals = fieldVals.Remove(fieldVals.Length - 1);
                    sql += "(" + fieldList + ") values (" + fieldVals + ")";
                    return db.ExecuteSql(sql);
                }
                else        //"出错,没有字段被组合!"
                    return false;
            }
    public bool Modify(object entity)
            {
                Type t = entity.GetType();
                PropertyInfo[] properties = t.GetProperties();
                if (properties.Count<PropertyInfo>() > 1)                //至少两个字段,一个主键,一个数据字段。
                {
    
                    string sql = "Update " + t.Name + " set ";       //约定:类名即为数据表名。
                    string fieldSet = "";
                    string fieldCondition = "";
                    bool firstEntry = true;
                    foreach (PropertyInfo field in properties)
                    {
                        if (firstEntry)        //约定:第一个字段为主键。
                        {
                            if (field.PropertyType.Name.StartsWith("Int"))
                                fieldCondition += field.Name + "=" + field.GetValue(entity, null);
                            else
                                fieldCondition += field.Name + "='" + field.GetValue(entity, null) + "'";
                            firstEntry = false;
                        }
                        else
                            switch (field.PropertyType.Name)            //约定:属性名即为数据字段名。
                            {
                                case "String":
                                case "DateTime":
                                    fieldSet += field.Name + "='" + field.GetValue(entity, null) + "',";
                                    break;
                                case "Int32":
                                case "Double":
                                    fieldSet += field.Name + "=" + field.GetValue(entity, null) + ",";
                                    break;
                                case "Boolean":
                                    fieldSet += field.Name + "=" + ((bool)field.GetValue(entity, null) ? 1 : 0) + ",";
                                    break;
                                default:
                                    break;
                            }
                    }
                    fieldSet = fieldSet.Remove(fieldSet.Length - 1);
                    sql += fieldSet + " where " + fieldCondition;
                    return db.ExecuteSql(sql);
                }
                else        //"出错,没有字段被组合!"
                    return false;
            }
    public bool Delete(object entity)
            {
                Type t = entity.GetType();
                PropertyInfo[] properties = t.GetProperties();
                if (properties.Count<PropertyInfo>() > 0)
                {
                    string sql = "Delete From " + t.Name + " where ";
                    string fieldCondition = "";
    
                    if (properties[0].PropertyType.Name.StartsWith("Int"))
                        fieldCondition += properties[0].Name + "=" + properties[0].GetValue(entity, null);
                    else
                        fieldCondition += properties[0].Name + "='" + properties[0].GetValue(entity, null) + "'";
    
                    sql += fieldCondition;
                    return db.ExecuteSql(sql);
                }
                else
                    return false;
            }
    public bool Select(object entity)
            {
                Type t = entity.GetType();
                PropertyInfo[] properties = t.GetProperties();
                if (properties.Count<PropertyInfo>() > 1)                //至少两个字段,一个主键,一个数据字段。
                {
    
                    string sql = "Select ";       //约定:类名即为数据表名。
                    string fieldList = "";
                    string fieldCondition = "";
                    bool firstEntry = true;
                    foreach (PropertyInfo field in properties)
                    {
                        if (firstEntry)        //约定:第一个字段为主键。
                        {
                            if (field.PropertyType.Name.StartsWith("Int"))
                                fieldCondition += field.Name + "=" + field.GetValue(entity, null);
                            else
                                fieldCondition += field.Name + "='" + field.GetValue(entity, null) + "'";
                            firstEntry = false;
                        }
                        else
                            switch (field.PropertyType.Name)            //约定:属性名即为数据字段名。
                            {
                                case "String":
                                case "DateTime":
                                    fieldList += field.Name + ",";
                                    break;
                                case "Int32":
                                case "Double":
                                    fieldList += field.Name + ",";
                                    break;
                                case "Boolean":
                                    fieldList += field.Name + ",";
                                    break;
                                default:
                                    break;
                            }
                    }
                    fieldList = fieldList.Remove(fieldList.Length - 1);
                    sql += fieldList + " from " + t.Name + " where " + fieldCondition;
                    var rs = db.getResult(sql);
                    if (rs.Count > 0)
                    {
                        int index = 1;
                        foreach (var al in rs)
                        {
                            switch (properties[index].PropertyType.Name)            //约定:属性名即为数据字段名。
                            {
                                case "String":
                                    properties[index].SetValue(entity, al, null);
                                    break;
                                case "DateTime":
                                    properties[index].SetValue(entity, DateTime.Parse(al.ToString()), null);
                                    break;
                                case "Int32":
                                    properties[index].SetValue(entity, Int32.Parse(al.ToString()), null);
                                    break;
                                case "Double":
                                    properties[index].SetValue(entity, Double.Parse(al.ToString()), null);
                                    break;
                                case "Boolean":
                                    properties[index].SetValue(entity, Boolean.Parse(al.ToString()), null);
                                    break;
                                default:
                                    break;
                            }
                            index++;
                        }
                        return true;
                    }
                    else
                        return false;
                }
                else        //"出错,没有字段被组合!"
                    return false;
            }

    上面的代码实现了最基本的单条纪录的增删改查,其中最麻烦的是查,最简单的是删。
    其中的db变量是数据库操作对象,这个大家都熟悉,我就不贴代码了,上面的代码提供思路供大家参考,若哪位兄弟需要代码,请到下面链接去下载,保证能正常运行,例子中给的是MYSQL的操作方法。
    下载链接:http://download.csdn.net/detail/ztk12/4975759
    MySql.Data.dll 这个动态链接库被我从项目中移除了,大家如果机子上没有的话,自己去下一个吧。

     
     
    分类: C#算法
    标签: C# ORM 反射
  • 相关阅读:
    天国近了(一) 揭穿OOP神话
    自然思考:流程任意定制的一个问题
    风水占卜是迷信吗?
    飘浮的鸡蛋壳真正的原理研究
    ListView
    Java与WCF交互(一):Java客户端调用WCF服务 (转)
    WPF ListView 数据绑定
    .NET中Trace类和Debug类的应用举例(转)
    Print Visual Tree
    EntityFramework之领域驱动设计实践(六)(转)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2852434.html
Copyright © 2011-2022 走看看