using System; using System.Collections.Generic; using System.Data; using System.Data.Common; namespace CSFramework.DB { /// /// 自定义SqlCommand的基类,组合SqlCommand对象. /// public class CommandHelper { protected DbCommand _cmd = null; private IDatabase _db = null; private string _paramPrefix; private Dictionary _Params = new Dictionary(); /// /// 参数前缀符号,如:@,?,p_,: /// public string ParamPrefix { get => _paramPrefix; set => _paramPrefix = value; } /// /// SqlCommand对象 /// public DbCommand Command => _cmd; /// /// SQL命令的参数 /// public DbParameterCollection Params => _cmd.Parameters; /// /// 清除参数 /// public void ClearParam() { _cmd.Parameters.Clear(); } /// /// 返回包含参数符号的参数名称,如:@Code /// /// /// private string ParseParamName(string paramName) { //调用具体数据库实例拼接产生 if (_db != null) { return _db.ParseParamName(paramName); } else { if (string.IsNullOrEmpty(_paramPrefix) || string.IsNullOrEmpty(paramName)) { return paramName; } else { if (paramName.IndexOf(_paramPrefix) == 0) //首字母包含 return paramName; else return _paramPrefix + paramName; //添加参数符号 } } } /// /// 删除参数 /// /// 参数名称 public void RemoveParam(string parameterName) { _cmd.Parameters.RemoveAt(ParseParamName(parameterName)); } /// /// 增加参数 /// /// 参数名称,不带符号 /// DbType类型 /// 长度 /// 值 public DbParameter AddParam(string parameterName, DbType dbType, int size, object value, ParameterDirection direction = ParameterDirection.Input) { DbParameter p; if (_db != null) p = _db.CreateParameter(parameterName, value); else p = _cmd.CreateParameter(); //重新赋值,自动添加参数符号 p.ParameterName = ParseParamName(parameterName); p.DbType = dbType; p.Size = size; p.Value = value == null ? DBNull.Value : value; p.Direction = direction; _cmd.Parameters.Add(p); return p; } public DbParameter AddParam(string parameterName, object value, ParameterDirection direction = ParameterDirection.Input) { DbParameter p; if (_db != null) p = _db.CreateParameter(parameterName, value); else p = _cmd.CreateParameter(); //重新赋值,自动添加参数符号 p.ParameterName = ParseParamName(parameterName); p.Value = value == null ? DBNull.Value : value; p.Direction = direction; _cmd.Parameters.Add(p); return p; } public DbParameter AddParam(string parameterName, ParameterDirection direction = ParameterDirection.Input) { return AddParam(parameterName, null, direction); } /// /// 增加参数 /// /// 参数名称,带@符号 /// SqlDbType类型 /// 值 /// 输入/输出类型 public DbParameter AddParam(string parameterName, DbType dbType, object value, ParameterDirection direction = ParameterDirection.Input) { DbParameter p; if (_db != null) p = _db.CreateParameter(parameterName, value); else p = _cmd.CreateParameter(); //重新赋值,自动添加参数符号 p.ParameterName = ParseParamName(parameterName); p.DbType = dbType; p.Value = value == null ? DBNull.Value : value; p.Direction = direction; _cmd.Parameters.Add(p); return p; } /// /// 添加Oracle游标参数,用于返回DataTable/DataSet /// /// /// public DbParameter AddParamOracleCursor(string parameterName = "") { var ParaName = string.IsNullOrEmpty(parameterName) ? "PCur" : parameterName; var refCursorType = Enum.Parse( ((dynamic)_cmd.CreateParameter()).OracleDbType.GetType(), "RefCursor"); var param = _cmd.CreateParameter(); param.ParameterName = ParaName; param.Direction = ParameterDirection.Output; var piInstance = param.GetType().GetProperty("OracleDbType"); piInstance.SetValue(param, refCursorType, null); _cmd.Parameters.Add(param); return param; } /// /// 给SqlCommand.Parameters赋值 /// /// 参数名 /// 数值 public void SetValue(string paramName, object value) { paramName = ParseParamName(paramName); var p = _cmd.Parameters[paramName]; if (p == null) throw new Exception(paramName + "参数不存在!"); p.Value = value == null ? DBNull.Value : value; } /// /// 获取参数的值 /// /// /// public object GetValue(string paramName) { paramName = ParseParamName(paramName); var p = _cmd.Parameters[paramName]; if (p == null) throw new Exception(paramName + "参数不存在!"); return p.Value; } public DbParameter GetParameter(string paramName) { paramName = ParseParamName(paramName); if (_cmd.Parameters.IndexOf(paramName) >= 0) return _cmd.Parameters[paramName]; else return null; } #region 构造器 /// /// 构造器 /// /// 数据库接口 /// SQL命令 /// SQL命令类型 public CommandHelper(IDatabase db, string sql, CommandType type) { _db = db; _cmd = db.CreateCommand(sql, type); _paramPrefix = db.ParamSymboName; } /// /// 构造器 /// /// Command对象 /// 参数符号,如:@,?,p_,: public CommandHelper(DbCommand cmd, string paramPrefix) { _cmd = cmd; _paramPrefix = paramPrefix; if (cmd == null) throw new Exception("参数必须为DbCommand派生类的实例!"); } #endregion } }