自己动手写轻量级ORM(C#)

最近在看反射,突然想写一个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 这个动态链接库被我从项目中移除了,大家如果机子上没有的话,自己去下一个吧。

你可能感兴趣的:(orm)