using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.EntityClient; using System.Data.Objects; using System.Collections; using System.Data.SqlClient; namespace GY.DA.Common { //为了处理所传哈希表key大小写不一致的情况,在建立哈希表时,采用如下方式建立: // private Hashtable data = new Hashtable(StringComparer.OrdinalIgnoreCase); /// <summary> /// 实现对数据的SQL操作(增删改) /// </summary> public class SqlHandler { #region 参数定义 private DbConnection conn; /// <summary> /// 链接字符串 /// </summary> private string _tableName = ""; private List<string> _tableKeys = new List<string>(); private List<DbParameter> plist = new List<DbParameter>(); private List<DbCommand> operList = new List<DbCommand>(); private Hashtable _FieldsTypes = new Hashtable(StringComparer.OrdinalIgnoreCase); public Hashtable FieldsTypes { get { return this._FieldsTypes; } } #endregion /// <summary> /// 构造函数 /// </summary> /// <param name="ASysName">连接字符串名称</param> /// <param name="tableName"></param> public SqlHandler(DbConnection connection, string tableName) { useTran = true; conn = connection; _tableName = tableName; Prepair(); } /// <summary> /// 构造函数 /// </summary> /// <param name="AConnName">连接字符串名称</param> public SqlHandler(DbConnection connection) { conn = connection; } /// <summary> /// 支持多个表更新 /// </summary> public string tableName { get { return _tableName; } set { SetTableName(value); } } /// <summary> /// 是否使用事务 /// </summary> public bool useTran { get; set; } /// <summary> /// 设置表的主键字段,数据处理时按照主键进行更新、删除, /// 插入数据时,如果主键有值,则插入主键值,否则不插入主键值 /// </summary> /// <param name="keys"></param> public void SetTableKeys(string[] keys) { _tableKeys.Clear(); _tableKeys.AddRange(keys); } private void SetTableName(string value) { if (value.Trim().ToLower() == _tableName.ToLower()) { return; } _tableName = value; Prepair(); } private DbType TypeToDbType(Type t) { DbType dbt; try { dbt = (DbType)Enum.Parse(typeof(DbType), t.Name); } catch { dbt = DbType.Object; } return dbt; } //获取数据表结构及字段类型 public void Prepair() { if (conn.State != ConnectionState.Open) { conn.Open(); } _FieldsTypes.Clear(); DbCommand cmd = conn.CreateCommand(); cmd.CommandText = "select * from " + _tableName + " where 0!=0"; using (DbDataReader reader = cmd.ExecuteReader()) { for (int i = 0; i < reader.FieldCount; i++) { //if (reader.GetName(i) == "PicStream" && _tableName.ToLower() == "XianCCY_PicS_Stream".ToLower()) //{ //} _FieldsTypes[reader.GetName(i)] = TypeToDbType(reader.GetFieldType(i)); } } } //如果不是字符类型的数据库类型,paramValue为带客格的字符串时去掉空格 private object getParamValue(bool valueEmpytToDBNull, object paramValue, DbType paramType) { object result = paramValue; if (paramValue == null) { return result; } if (valueEmpytToDBNull && (paramValue.GetType().Name == "String")) { if ((paramType != DbType.AnsiString) || (paramType != DbType.String) || (paramType != DbType.StringFixedLength)) { result = paramValue.ToString().Trim(); } } return result; } private bool CreateSqlParams(string paramName, object paramValue, DbType paramType, DbCommand cmd, bool valueEmpytToDBNull = true) { bool result = false; if ((cmd == null) || (string.IsNullOrEmpty(paramName))) { return result; } paramValue = getParamValue(valueEmpytToDBNull, paramValue, paramType); DbParameter param = cmd.CreateParameter(); param.ParameterName = paramName; param.DbType = paramType; if ((paramValue == null) || (valueEmpytToDBNull) && (string.IsNullOrEmpty(paramValue.ToString()))) { param.Value = DBNull.Value; } else { if (paramType == DbType.Boolean) { string v = paramValue.GetType().ToString().ToLower(); bool value = true; //数字类型,0代表false,字符串:true代表true,bool型直接用,其它只要不空,就为真 if (v.Contains("int")) { value = (int)paramValue != 0; } else if (v.Contains("string")) { string pv= paramValue.ToString().ToLower(); value = pv == "true" || pv == "on" || pv == "1" || pv == "checked" || pv=="是"; } else if (v.Contains("bool")) { value = (bool)paramValue; } param.Value = value; } else { if (paramType.ToString().ToLower().Contains("date") && (paramValue == null || paramValue.ToString() == "")) { param.Value = DBNull.Value; } else { param.Value = paramValue; } } } cmd.Parameters.Add(param); return result; } public void InsertRow(Hashtable rowData) { DbCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; string sql = "insert into " + _tableName + "("; string sqlv = " values("; foreach (string key in _FieldsTypes.Keys) { if (rowData.ContainsKey(key)) { sql += "[" + key + "],"; sqlv += "@" + key + ","; } } sql = sql.Substring(0, sql.Length - 1); sqlv = sqlv.Substring(0, sqlv.Length - 1); cmd.CommandText = sql + ")" + sqlv + ")"; foreach (string key in _FieldsTypes.Keys) { if (rowData.ContainsKey(key)) { CreateSqlParams(key, rowData[key], (DbType)_FieldsTypes[key.ToLower()], cmd); } } operList.Add(cmd); } //利用key=value进行数据更新 public void UpdateRow(Hashtable rowData, string key, string Value) { Hashtable wData = new Hashtable(StringComparer.OrdinalIgnoreCase); wData[key] = Value; UpdateRow(rowData, wData); } /// <summary> /// 利用表的键值进行更新,键取自Tablekeys,值从rowData中读取 /// </summary> /// <param name="rowData"></param> public void UpdateRow(Hashtable rowData) { Hashtable wData = new Hashtable(StringComparer.OrdinalIgnoreCase); foreach (string key in _tableKeys) { if (!rowData.ContainsKey(key)) { throw new Exception("数据中缺少更新的主键!"); } else { wData[key] = rowData[key]; } } UpdateRow(rowData, wData); } /// <summary> /// 根据whereData中的值对进行更新,数据采用=判断 /// </summary> /// <param name="rowData"></param> /// <param name="whereData"></param> public void UpdateRow(Hashtable rowData, Hashtable whereData) { DbCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; string sql = "update " + _tableName + " set "; foreach (string key in _FieldsTypes.Keys) { if (rowData.ContainsKey(key)) //不更新主键字段 { sql += "[" + key + "] = @" + key + ","; } } sql = sql.Substring(0, sql.Length - 1); string wSQL = ""; foreach (string key in whereData.Keys) { wSQL += "[" + key + "]" + "= @where__" + key + " and "; } if (wSQL != "") { sql += " where " + wSQL.Substring(0, wSQL.Length - 4); } //生成要更新的数据参数表 foreach (string key in _FieldsTypes.Keys) { if (rowData.ContainsKey(key)) { CreateSqlParams(key, rowData[key], (DbType)_FieldsTypes[key.ToLower()], cmd); } } //生成Where条件参数表 foreach (string key in whereData.Keys) { CreateSqlParams("where__" + key, whereData[key], (DbType)_FieldsTypes[key], cmd, false); } cmd.CommandText = sql; operList.Add(cmd); } /// <summary> /// 根据whereSQL和whereParams中的值对进行数据更新,可以更新主键值 /// </summary> /// <param name="rowData"></param> /// <param name="whereSQL"></param> /// <param name="whereParams"></param> public void UpdateRow(Hashtable rowData, string whereSQL, Hashtable whereParams) { DbCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; string sql = "update " + _tableName + " set "; foreach (string key in _FieldsTypes.Keys) { if (rowData.ContainsKey(key)) { sql += "[" + key + "] = @" + key + ","; } } sql = sql.Substring(0, sql.Length - 1); //生成要更新的数据参数表 foreach (string key in whereParams.Keys) { if (rowData.ContainsKey(key)) { CreateSqlParams(key, rowData[key], (DbType)_FieldsTypes[key], cmd); } } //生成Where条件参数表 foreach (string key in whereParams.Keys) { CreateSqlParams(key, whereParams[key], (DbType)_FieldsTypes[key], cmd, false); } cmd.CommandText = sql + " where " + whereSQL; operList.Add(cmd); } public void DeleteRow(Hashtable whereData) { if (whereData.Count == 0) { return; } DbCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; string sql = "delete from " + _tableName + " where"; foreach (string key in whereData.Keys) { sql += " [" + key + "]" + "=@where__" + key + " and "; CreateSqlParams("where__" + key, whereData[key], (DbType)_FieldsTypes[key], cmd, false); } cmd.CommandText = sql.Substring(0, sql.Length - 4); operList.Add(cmd); } public void DeleteRow(string key, string value) { Hashtable wData = new Hashtable(StringComparer.OrdinalIgnoreCase); wData[key] = value; DeleteRow(wData); } public void DeleteRow(string delSql, Hashtable whereParams) { DbCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = delSql; //生成Where条件参数表 foreach (string key in whereParams.Keys) { CreateSqlParams(key, whereParams[key], (DbType)_FieldsTypes[key], cmd, false); } operList.Add(cmd); } public void DeleteAll() { DbCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; string sql = "delete from " + _tableName; cmd.CommandText = sql; operList.Add(cmd); } /// <summary> /// 执行SQL语句添加 /// </summary> /// <param name="ASqlCommond"></param> public void ExecuteSql(string ASqlCommond) { DbCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = ASqlCommond; operList.Add(cmd); } public bool CopyCommand(DbCommand fromCom, ref DbCommand toCom) { bool result = false; try { toCom.Parameters.Clear(); toCom.CommandText = fromCom.CommandText; toCom.CommandType = fromCom.CommandType; foreach (DbParameter param in fromCom.Parameters) { DbParameter tmpParam = toCom.CreateParameter(); tmpParam.DbType = param.DbType; tmpParam.ParameterName = param.ParameterName; tmpParam.Value = param.Value; toCom.Parameters.Add(tmpParam); } } catch { return result; } result = true; return result; } public int ExecuteScalar() { int m_Ret = 0; try { if (conn.State != ConnectionState.Open) { conn.Open(); } foreach (DbCommand cmd in operList) { m_Ret = Int32.Parse( cmd.ExecuteScalar().ToString()); } } catch (Exception e) { m_Ret = 0; throw e; } finally { operList.Clear(); conn.Close(); } return m_Ret; } public string ErrorMessage {private set; get; } public int SqlSave() { int m_Ret = 0; ErrorMessage = ""; DbTransaction dbTran = null; try { if (conn.State != ConnectionState.Open) { conn.Open(); } if (useTran) { dbTran = conn.BeginTransaction(); } for (int i = 0; i < operList.Count; i++) { if (dbTran != null) { operList[i].Transaction = dbTran; } operList[i].ExecuteNonQuery(); } if (dbTran != null) dbTran.Commit(); m_Ret = 1; } catch (Exception ex) { if (dbTran != null) dbTran.Rollback(); ErrorMessage = ex.Message; m_Ret = 0; } finally{ operList.Clear(); conn.Close(); } return m_Ret; } // 扩展提交数据脚本方法,使用带参数的 insert update 或 delete sql 语句,不使用事务。 /// <summary> /// 执行 insert update 或 delete 脚本并返回受影响的行数,使用 <paramref name="parameters"/> 指定的参数。 /// </summary> /// <param name="sql">insert update 或 delete 脚本</param> /// <param name="parameters">数据参数,允许为空或空数组</param> /// <returns></returns> public int ExecuteSql(string sql, params System.Data.SqlClient.SqlParameter[] parameters) { if (conn.State != ConnectionState.Open) conn.Open(); DbCommand cmd = conn.CreateCommand(); if (parameters != null && parameters.Length > 0) { foreach (var p in parameters) { cmd.Parameters.Add(p); } } cmd.CommandText = sql; int result = cmd.ExecuteNonQuery(); conn.Close(); return result; } public int ExecuteSqlProc(string sql, params System.Data.SqlClient.SqlParameter[] parameters) { if (conn.State != ConnectionState.Open) conn.Open(); DbCommand cmd = conn.CreateCommand(); if (parameters != null && parameters.Length > 0) { foreach (var p in parameters) { cmd.Parameters.Add(p); } } cmd.CommandText = sql; cmd.CommandType = CommandType.StoredProcedure; int result = cmd.ExecuteNonQuery(); conn.Close(); return result; } /// <summary> /// 自增长id 插入 加获取插入id的条件 /// </summary> /// <param name="rowData"></param> /// <param name="id_ZiZ">1</param> public void InsertRow(Hashtable rowData ,string id_ZiZ) { DbCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; string sql = "insert into " + _tableName + "("; string sqlv = " values("; foreach (string key in _FieldsTypes.Keys) { if (rowData.ContainsKey(key)) { sql += "[" + key + "],"; sqlv += "@" + key + ","; } } sql = sql.Substring(0, sql.Length - 1); sqlv = sqlv.Substring(0, sqlv.Length - 1); cmd.CommandText = sql + ")" + sqlv + ")"; if (!string.IsNullOrEmpty(id_ZiZ)&&id_ZiZ=="1") { cmd.CommandText += " SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY] "; } foreach (string key in _FieldsTypes.Keys) { if (rowData.ContainsKey(key)) { CreateSqlParams(key, rowData[key], (DbType)_FieldsTypes[key.ToLower()], cmd); } } operList.Add(cmd); } } }