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
}
}