zoukankan      html  css  js  c++  java
  • 自己动手写ORM框架(七):实现新增功能Save方法

        在上一篇中讲了根据ID查询的功能FindById方法,接下来将实现Save方法的功能,代码如下1-1:

    #region 将实体数据保存到数据库
    public int Save<T>(T entity)
    {        
        //从实体类中获取新增数据所需的表信息存于TableInfo对象中                            
        TableInfo tableInfo = DbEntityUtils.GetTableInfo(entity,DbOperateType.INSERT);
    
        //根据tableInfo对象中的数据生成新增的SQL语句
        string strSql = DbEntityUtils.GetInsertSql(tableInfo);            
    
        //根据tableInfo中Columns的数量创建参数数组
        IDbDataParameter[] parms = DbFactory.CreateDbParameters(tableInfo.Columns.Count);
       
        //将tableInfo对象中Columns集合中数据设置到参数数组中
        DbEntityUtils.SetParameters(tableInfo.Columns, parms);
            
        //执行SQL命令        
        object val = AdoHelper.ExecuteNonQuery(transaction, CommandType.Text, strSql, parms);
    
        //返回所影响的行数
        return Convert.ToInt32(val);
    }
    #endregion

       代码1-1中DbEntityUtils.GetTableInfo方法在实现查询功能FindById方法中已经有分析了。

        代码string strSql = DbEntityUtils.GetInsertSql(tableInfo); 中DbEntityUtils.GetInsertSql代码如下1-2:

    public static string GetInsertSql(TableInfo tableInfo)
    {
        StringBuilder sbColumns = new StringBuilder();
        StringBuilder sbValues = new StringBuilder();
    
        //将tableInfo中的Id的名称和值存入Columns集合中
        tableInfo.Columns.Put(tableInfo.Id.Key, tableInfo.Id.Value);
        foreach (string key in tableInfo.Columns.Keys)
        {
            if (!string.IsNullOrEmpty(key.Trim()))
            {
                //根据Columns集合中key生成SQL语句,例如:
                //strsql = “insert into student(studentid,studentno,name) values((@studentid,@studentno,@name)”;
                object value = tableInfo.Columns[key];
                sbColumns.Append(key).Append(",");
                sbValues.Append(AdoHelper.DbParmChar).Append(key).Append(",");
            }
        }
    
        sbColumns.Remove(sbColumns.ToString().Length - 1, 1);
        sbValues.Remove(sbValues.ToString().Length - 1, 1);
    
        string strSql = "INSERT INTO {0}({1}) VALUES({2})";
        strSql = string.Format(strSql, tableInfo.TableName, sbColumns.ToString(), sbValues.ToString());
    
        return strSql;
    }

        代码1-1中:IDbDataParameter[] parms = DbFactory.CreateDbParameters(tableInfo.Columns.Count);

        创建一个指定大小的参数数组,根据不同的数据库类型创建对应的参数数组,代码如下1-3:

    // <summary>
    // 根据配置文件中所配置的数据库类型
    // 和传入的参数来创建相应数据库的参数数组对象
    // </summary>
    // <returns></returns>
    public static IDbDataParameter[] CreateDbParameters(int size)
    {
        int i = 0;
        IDbDataParameter[] param = null;
        switch (AdoHelper.DbType)
        {
            case DatabaseType.SQLSERVER:
                param = new SqlParameter[size];
                while (i < size) { param[i] = new SqlParameter(); i++; }
                break;
            case DatabaseType.ORACLE:
                param = new OracleParameter[size];
                while (i < size) { param[i] = new OracleParameter(); i++; }
                break;
            case DatabaseType.ACCESS:
                param = new OleDbParameter[size];
                while (i < size){param[i] = new OleDbParameter();i++;}
                break;
            default: 
                throw new Exception("数据库类型目前不支持!");
    
        }
    
        return param;
    }
        代码1-1中:DbEntityUtils.SetParameters(tableInfo.Columns, parms);
    将tableInfo.Columns集合中的数据赋值给参数数组,代码如下1-4:
    public static void SetParameters(ColumnInfo columns, params IDbDataParameter[] parms)
    {
        int i = 0;
        foreach (string key in columns.Keys)
        {
            if (!string.IsNullOrEmpty(key.Trim()))
            {
                parms[i].ParameterName = key;
                parms[i].Value = columns[key];
                i++;
            }
        }
    }

        到此,Save方法的主要代码已经完成,未讲到的都在前面已经有分析到,这里不重复了。在上面多次使用到了TableInfo这个类,下面将贴出TableInfo代码:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;
    
    namespace System.Orm.Common
    {
        public class TableInfo
        {
            //存放表名的变量
             private string tableName;
           
            //存放主键生成方式的变量
            private int strategy;
     
            //存放Id列名和列值的对象
             private IdInfo id = new IdInfo();
            
            //存放列名和列值的集合
             private ColumnInfo columns = new ColumnInfo();
            
            //存放属性名和列名对象关系的集合
             private Map propToColumn = new Map();
            
            public Map PropToColumn
            {
                get { return propToColumn; }
                set { propToColumn = value; }
            } 
    
            public string TableName
            {
                get { return tableName; }
                set { tableName = value; }
            }
    

                 public int Strategy
                 {
                     get { return strategy; }
                     set { strategy = value; }
                 }

            
            public IdInfo Id
            {
                get { return id; }
                set { id = value; }
            }        
                    
            public ColumnInfo Columns
            {
                get { return columns; }
                set { columns = value; }
            }
        }
    }
        ColumnInfo 类代码:
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;
    
    namespace System.Orm.Common
    {
        public class ColumnInfo : Map
        {        
           
        }
    }
        IdInfo类代码:
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace System.Orm.Common
    {
        public class IdInfo
        {
            private string key;
            private object value;
    
            public string Key
            {
                get { return key; }
                set { key = value; }
            }        
    
            public object Value
            {
                get { return this.value; }
                set { this.value = value; }
            }
        }
    }

        Map类代码:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;
    
    namespace System.Orm.Common
    {
        public class Map : Hashtable
        {
            public void Put(object key,object value)
            {
                this.Add(key, value);
            }      
        }
    }
    

    Save方法所需代码都已在上面了。

    Technorati 标签: ORM
  • 相关阅读:
    升级安装 Ubuntu 后该做的20项优化工作
    Delphi中点击DBGrid某一行获得其详细数据方法
    android eclipse xml不自动代码提示
    区别不同浏览器,CSS hack写法
    自我介绍
    秋季学期学习总结
    人生路上影响最大的三位老师
    SQL优化34条
    Visual Studio 2010将支持多种架构设计图
    Visual Studio 2010的SharePoint工作流功能
  • 原文地址:https://www.cnblogs.com/wangwei123/p/1770417.html
Copyright © 2011-2022 走看看