在上一篇中讲了根据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; } } } }
using System; using System.Collections; using System.Collections.Generic; using System.Text; namespace System.Orm.Common { public class ColumnInfo : Map { } }
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方法所需代码都已在上面了。