using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
namespace CSFramework.DB
{
///
/// CSFramework通用数据框架-对象实体,支持MsSQL,MySQL,Oracle三种数据库
///
public class DbFramework
{
///
/// 当前事务
///
protected DbTransaction _CurrentTrans = null;
protected IDatabase _db;
///
/// 构造器
///
/// CSFramework.DB数据库底层通用接口
public DbFramework(IDatabase db)
{
_db = db;
}
///
/// 构造器
///
/// CSFramework.DB数据库底层通用接口
/// 事务
public DbFramework(IDatabase db, DbTransaction tran = null)
{
_db = db;
_CurrentTrans = tran;
}
///
/// 启动事务机制
///
private void BeginTransaction()
{
if (_CurrentTrans == null)
_CurrentTrans = _db.TransBegin();
}
///
/// 提交事务
///
private void CommitTransaction()
{
try
{
if (_CurrentTrans != null)
{
_CurrentTrans.Commit();
_CurrentTrans.Dispose();
_CurrentTrans = null;
}
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 回滚事务
///
private void RollbackTransaction()
{
try
{
if (_CurrentTrans != null)
{
_CurrentTrans.Rollback();
_CurrentTrans.Dispose();
_CurrentTrans = null;
}
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 查询数据,返回对象列表
///
/// 对象类型
/// 查询语句
///
public List Select(string sql) where T : new()
{
return _db.ExecuteReaderList(sql);
}
///
/// 获取当前模型所有数据
///
///
///
public List Select() where T : new()
{
var sql = $"SELECT * FROM {typeof(T).Name}";
return _db.ExecuteReaderList(sql);
}
public T Select(string keyFieldName, object keyValue) where T : new()
{
var sql =
$"SELECT * FROM {typeof(T).Name} WHERE {keyFieldName}={_db.ParamSymboName + keyFieldName}";
var cmd = _db.CreateCommand(sql);
cmd.AddParam(keyFieldName).Value = keyValue;
return _db.ExecuteReader(cmd.Command);
}
///
/// 查询数据,返回对象列表
///
/// 对象类型
/// 命令
///
public List Select(DbCommand cmd) where T : new()
{
return _db.ExecuteReaderList(cmd);
}
///
/// 提交单表DataTable
///
/// DataTable对象
/// DataTable对应的实体类
/// 主键字段数组
/// 自增字段(或不能更新的字段)数组
/// 指定更新的字段
///
public int Update(DataTable dt, Type orm,
string[] PKs,
string[] ignoreFields = null,
string[] updateFields = null)
{
var count = 0;
try
{
BeginTransaction();
var generator = new DbCommandGenerator(_db);
var adp = _db.CreateDataAdapter();
adp.UpdateCommand =
generator.GetUpdateCommand(orm, PKs, ignoreFields,
updateFields);
adp.InsertCommand =
generator.GetInsertCommand(orm, ignoreFields);
adp.DeleteCommand = generator.GetDeleteCommand(orm, PKs);
adp.UpdateCommand.Transaction = _CurrentTrans;
adp.InsertCommand.Transaction = _CurrentTrans;
adp.DeleteCommand.Transaction = _CurrentTrans;
adp.UpdateCommand.Connection = _CurrentTrans.Connection;
adp.InsertCommand.Connection = _CurrentTrans.Connection;
adp.DeleteCommand.Connection = _CurrentTrans.Connection;
adp.AcceptChangesDuringUpdate = false;
count += adp.Update(dt);
adp.Dispose();
CommitTransaction();
return count;
}
catch (DBConcurrencyException ex)
{
RollbackTransaction(); //回滚事务
throw new Exception(
"并发操作!其他用户已更新了源数据!Event:DbDataUpdate.Update()\r\n\r\n" +
ex.Message);
}
catch (Exception ex)
{
RollbackTransaction(); //回滚事务
throw new Exception(
"更新数据发生错误!Event:DbDataUpdate。Update(),Table:" +
dt.TableName + "\r\n\r\n" + ex.Message);
}
}
///
/// 提交Dataset多表数据
///
/// 数据集
/// ORM与表结构参数定义
///
public int Update(DataSet ds, List orms)
{
if (ds.Tables.Count != orms.Count)
throw new Exception("数据表与对象模型的数目不一致!");
var generator = new DbCommandGenerator(_db);
var mCurrentTable = "";
DbDataUpdateORM mORM;
var count = 0;
try
{
BeginTransaction();
foreach (DataTable dt in ds.Tables)
{
mCurrentTable = dt.TableName;
mORM = orms[ds.Tables.IndexOf(dt)];
var adp = _db.CreateDataAdapter();
adp.UpdateCommand =
generator.GetUpdateCommand(mORM.ObjectType, mORM.PKs,
mORM.IgnoreFields);
adp.InsertCommand =
generator.GetInsertCommand(mORM.ObjectType,
mORM.IgnoreFields);
adp.DeleteCommand =
generator.GetDeleteCommand(mORM.ObjectType, mORM.PKs);
adp.UpdateCommand.Transaction = _CurrentTrans;
adp.InsertCommand.Transaction = _CurrentTrans;
adp.DeleteCommand.Transaction = _CurrentTrans;
adp.UpdateCommand.Connection = _CurrentTrans.Connection;
adp.InsertCommand.Connection = _CurrentTrans.Connection;
adp.DeleteCommand.Connection = _CurrentTrans.Connection;
adp.AcceptChangesDuringUpdate = false;
count += adp.Update(dt);
adp.Dispose();
}
CommitTransaction();
return count;
}
catch (DBConcurrencyException ex)
{
RollbackTransaction(); //回滚事务
throw new Exception(
"并发操作!其他用户已更新了源数据!Event:DbDataUpdate.Update()\r\n\r\n" +
ex.Message);
}
catch (Exception ex)
{
RollbackTransaction(); //回滚事务
throw new Exception("更新数据发生错误!Event:Update(),Table:" +
mCurrentTable + "\r\n\r\n" + ex.Message);
}
}
///
/// 新增对象
///
/// 对象实例
/// 自增字段(或不支持更新的字段)数组
///
public bool AddObject(T obj, params string[] ignoreFields)
where T : new()
{
var count = 0;
using (var conn = _db.CreateConnection())
{
try
{
var generator = new DbCommandGenerator(_db);
var cmd = generator.GetInsertCommand(obj, ignoreFields);
cmd.Connection = conn;
cmd.Transaction = _CurrentTrans;
var i = _db.ExecuteCommand(cmd);
if (i > 0) count += i;
return count > 0;
}
catch (Exception ex)
{
throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" +
ex.Message);
}
}
}
///
/// 新增对象
///
/// 对象实例
/// 自增字段(或不支持更新的字段)数组
/// 返回的最大自增字段值
///
public bool AddObject(T obj, string[] ignoreFields, out int isid)
where T : new()
{
isid = 0;
var count = 0;
using (var conn = _db.CreateConnection())
{
try
{
var generator = new DbCommandGenerator(_db);
var cmd = generator.GetInsertCommand(obj, ignoreFields);
var tableName =
generator.GetTableName(obj.GetType()); //获取类对应的表名
cmd.Connection = conn;
cmd.Transaction = _CurrentTrans;
var i = _db.ExecuteCommand(cmd);
if (i > 0)
{
count += i;
isid = _db.GetMaxID(tableName); //获取最大的isid
}
return count > 0;
}
catch (Exception ex)
{
throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" +
ex.Message);
}
}
}
///
/// 新增对象列表
///
/// 对象实例列表
/// 自增字段(或不支持更新的字段)数组
///
public int AddList(List list, params string[] ignoreFields)
where T : new()
{
var generator = new DbCommandGenerator(_db);
var count = 0;
BeginTransaction();
try
{
foreach (var obj in list)
{
var cmd = generator.GetInsertCommand(obj, ignoreFields);
cmd.Transaction = _CurrentTrans;
cmd.Connection = _CurrentTrans.Connection;
var i = _db.ExecuteCommand(cmd);
if (i > 0) count += i;
}
CommitTransaction();
return count;
}
catch (Exception ex)
{
RollbackTransaction();
throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" +
ex.Message);
}
}
///
/// 批量更新对象列表数据
///
/// 对象实例列表
/// 主键字段名数组
/// 自增字段(或不支持更新的字段)数组
///
public int UpdateList(List list,
string[] PKs = null,
string[] ignoreFields = null,
string[] updateFields = null) where T : new()
{
var generator = new DbCommandGenerator(_db);
var count = 0;
try
{
BeginTransaction();
foreach (var obj in list)
{
var cmd = generator.GetUpdateCommand(obj, PKs,
ignoreFields, updateFields);
cmd.Transaction = _CurrentTrans;
cmd.Connection = _CurrentTrans.Connection;
var i = _db.ExecuteCommand(cmd);
if (i > 0) count += i;
}
CommitTransaction();
return count;
}
catch (Exception ex)
{
RollbackTransaction();
throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" +
ex.Message);
}
}
///
/// 修改对象,更新单个对象数据
///
/// 对象实例
/// 主键字段名数组
/// 自增字段(或不支持更新的字段)数组
///
public bool UpdateObject(T obj,
string[] PKs = null,
string[] ignoreFields = null,
string[] updateFields = null) where T : new()
{
var count = 0;
using (var conn = _db.CreateConnection())
{
try
{
var generator = new DbCommandGenerator(_db);
var cmd = generator.GetUpdateCommand(obj, PKs,
ignoreFields, updateFields);
cmd.Connection = conn;
cmd.Transaction = _CurrentTrans;
var i = _db.ExecuteCommand(cmd);
if (i > 0) count += i;
return count > 0;
}
catch (Exception ex)
{
throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" +
ex.Message);
}
}
}
///
/// 批量删除数据
///
///
/// 对象实例列表
/// 主键字段名数组
///
public int DeleteList(List list, params string[] PKs)
where T : new()
{
var generator = new DbCommandGenerator(_db);
var count = 0;
try
{
BeginTransaction();
foreach (var obj in list)
{
var cmd = generator.GetDeleteCommand(obj, PKs);
cmd.Transaction = _CurrentTrans;
cmd.Connection = _CurrentTrans.Connection;
var i = _db.ExecuteCommand(cmd);
if (i > 0) count += i;
}
CommitTransaction();
return count;
}
catch (Exception ex)
{
RollbackTransaction();
throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" +
ex.Message);
}
}
///
/// 删除对象
///
/// 对象实例
/// 主键字段名数组
///
public bool DeleteObject(T obj, params string[] PKs) where T : new()
{
var count = 0;
using (var conn = _db.CreateConnection())
{
try
{
var generator = new DbCommandGenerator(_db);
var cmd = generator.GetDeleteCommand(obj, PKs);
cmd.Connection = conn;
cmd.Transaction = _CurrentTrans;
var i = _db.ExecuteCommand(cmd);
if (i > 0) count += i;
return count > 0;
}
catch (Exception ex)
{
throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" +
ex.Message);
}
}
}
}
///
/// 旧的名称:DbDataUpdate, 请使用DbFramework
///
public class DbDataUpdate : DbFramework
{
///
/// 构造器
///
/// CSFramework.DB数据库底层通用接口
public DbDataUpdate(IDatabase db) : base(db)
{
}
///
/// 构造器
///
/// CSFramework.DB数据库底层通用接口
/// 事务
public DbDataUpdate(IDatabase db, DbTransaction tran = null) : base(db,
tran)
{
}
}
}