现在的位置: 首页 > 综合 > 正文

自己动手写ORM框架(七):实现新增功能Save方法

2012年04月10日 ⁄ 综合 ⁄ 共 4073字 ⁄ 字号 评论关闭

    在上一篇中讲了根据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 标签:

抱歉!评论已关闭.