using System; using System.Data; using System.Data.SqlClient; using System.Collections; namespace BLL { /// /// 所有数据访问层类的基类,封装了一些数据库访问的保护方法 /// /// public class SQLHelper { private static string connectionString = Funs.ConnString; //private static SqlConnection Connection=new SqlConnection( connectionString ); //public static SqlConnection GetConn() //{ // return Connection; //} /// ///被RunProcedure调用 构建 SqlCommand 对象. /// /// Name of the stored procedure in the DB, eg. sp_DoTask /// Array of IDataParameter objects containing parameters to the stored proc /// Newly instantiated SqlCommand instance private static SqlCommand BuildIntCommand(string storedProcName, IDataParameter[] parameters) { SqlCommand command = BuildQueryCommand( storedProcName, parameters ); command.Parameters.Add( new SqlParameter ( "ReturnValue", SqlDbType.Int, 4, /* Size */ ParameterDirection.ReturnValue, false, /* is nullable */ 0, /* byte precision */ 0, /* byte scale */ string.Empty, DataRowVersion.Default, null )); return command; } /// /// 在BuildIntCommand中被调用的私有函数,用于构建 SqlCommand 对象. /// /// Name of the stored procedure /// Array of IDataParameter objects /// private static SqlCommand BuildQueryCommand(string storedProcName, IDataParameter[] parameters) { using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(storedProcName, Connection); command.CommandType = CommandType.StoredProcedure;//执行存储过程 foreach (SqlParameter parameter in parameters) { command.Parameters.Add(parameter); } return command; } finally { Connection.Close(); } } } public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected) { int result; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = BuildIntCommand(storedProcName, parameters); rowsAffected = command.ExecuteNonQuery();//执行完存储过程后返回的结果 result = (int)command.Parameters["ReturnValue"].Value; } catch { rowsAffected = -1; result = -1; Connection.Close(); } finally { Connection.Close(); } } return result; } /// /// 通过存储过程获得新ID(存储过程有返回值有个output参数) /// /// 存储过程名 /// public static string RunProcNewId(string storedProcName) { string str = ""; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(storedProcName, Connection); command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(new SqlParameter("@returnVal", SqlDbType.VarChar, 50)); command.Parameters["@returnVal"].Direction = ParameterDirection.Output; command.ExecuteNonQuery(); str = command.Parameters["@returnVal"].Value.ToString(); } catch { Connection.Close(); } finally { Connection.Close(); } } return str; } /// /// 通过存储过程名和表名以及列名获得新ID(存储过程有返回值有个output参数) /// /// 存储过程名 /// 表名 /// 列名 /// public static string RunProcNewId(string storedProcName, string tableName, string columnName) { string str = ""; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(storedProcName, Connection); command.CommandType = CommandType.StoredProcedure; SqlParameter[] values = new SqlParameter[] { new SqlParameter("@tableName", tableName), new SqlParameter("@columnName", columnName), new SqlParameter("@returnVal", SqlDbType.VarChar, 10) }; command.Parameters.AddRange(values); command.Parameters["@returnVal"].Direction = ParameterDirection.Output; command.ExecuteNonQuery(); str = command.Parameters["@returnVal"].Value.ToString(); } catch { Connection.Close(); } finally { Connection.Close(); } } return str; } /// /// 通过存储过程名和表名以及列名获得新ID(存储过程有返回值有个output参数) /// /// 存储过程名 /// 表名 /// 列名 /// 前缀 /// 递增的新ID public static string RunProcNewId(string storedProcName, string tableName, string columnName, string toCode, string prefix) { string str = ""; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(storedProcName, Connection); command.CommandType = CommandType.StoredProcedure; SqlParameter[] values = new SqlParameter[] { new SqlParameter("@tableName", tableName), new SqlParameter("@columnName", columnName), new SqlParameter("@toCode", toCode), new SqlParameter("@prefix", prefix), new SqlParameter("@returnVal", SqlDbType.VarChar, 30) }; command.Parameters.AddRange(values); command.Parameters["@returnVal"].Direction = ParameterDirection.Output; command.ExecuteNonQuery(); str = command.Parameters["@returnVal"].Value.ToString(); } catch { Connection.Close(); } finally { Connection.Close(); } } return str; } /// /// 通过存储过程名和表名以及列名获得新ID(存储过程有返回值有个output参数) /// /// 存储过程名 /// 表名 /// 列名 /// 项目号 /// 递增的流水号 public static string RunProcFlowCode(string storedProcName, string tableName, string columnName, string projectId) { string str = ""; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(storedProcName, Connection); command.CommandType = CommandType.StoredProcedure; SqlParameter[] values = new SqlParameter[] { new SqlParameter("@tableName", tableName), new SqlParameter("@columnName", columnName), new SqlParameter("@projectId", projectId), new SqlParameter("@returnVal", SqlDbType.VarChar, 30) }; command.Parameters.AddRange(values); command.Parameters["@returnVal"].Direction = ParameterDirection.Output; command.ExecuteNonQuery(); str = command.Parameters["@returnVal"].Value.ToString(); } catch { Connection.Close(); } finally { Connection.Close(); } } return str; } public static string RunProcNewId(string storedProcName, string tableName, string columnName, string prefix) { string str = ""; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(storedProcName, Connection); command.CommandType = CommandType.StoredProcedure; SqlParameter[] values = new SqlParameter[] { new SqlParameter("@tableName", tableName), new SqlParameter("@columnName", columnName), new SqlParameter("@prefix", prefix), new SqlParameter("@returnVal", SqlDbType.VarChar, 30) }; command.Parameters.AddRange(values); command.Parameters["@returnVal"].Direction = ParameterDirection.Output; command.ExecuteNonQuery(); str = command.Parameters["@returnVal"].Value.ToString(); } catch { Connection.Close(); } finally { Connection.Close(); } } return str; } /// /// 通过存储过程名和表名以及列名获得新ID(存储过程有返回值有个output参数) /// /// 存储过程名 /// 表名 /// 列名 /// 前缀 /// 对应编号 /// 递增的新ID public static string RunProcNewId(string storedProcName, string tableName, string columnName, string projectId, string prefix, string toCode) { string str = ""; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(storedProcName, Connection); command.CommandType = CommandType.StoredProcedure; SqlParameter[] values = new SqlParameter[] { new SqlParameter("@tableName", tableName), new SqlParameter("@columnName", columnName), new SqlParameter("@projectId", projectId), new SqlParameter("@prefix", prefix), new SqlParameter("@toCode", toCode), new SqlParameter("@returnVal", SqlDbType.VarChar, 30) }; command.Parameters.AddRange(values); command.Parameters["@returnVal"].Direction = ParameterDirection.Output; command.ExecuteNonQuery(); str = command.Parameters["@returnVal"].Value.ToString(); } catch { Connection.Close(); } finally { Connection.Close(); } } return str; } /// /// 通过存储过程名和表名以及列名获得新ID(存储过程有返回值有个output参数) /// /// 存储过程名 /// 表名 /// 列名 /// 前缀 /// 递增的新ID public static string RunProcNewIdByProjectId(string storedProcName, string tableName, string columnName, string projectId, string prefix) { string str = ""; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(storedProcName, Connection); command.CommandType = CommandType.StoredProcedure; SqlParameter[] values = new SqlParameter[] { new SqlParameter("@tableName", tableName), new SqlParameter("@columnName", columnName), new SqlParameter("@projectId", projectId), new SqlParameter("@prefix", prefix), new SqlParameter("@returnVal", SqlDbType.VarChar, 50) }; command.Parameters.AddRange(values); command.Parameters["@returnVal"].Direction = ParameterDirection.Output; command.ExecuteNonQuery(); str = command.Parameters["@returnVal"].Value.ToString(); } catch { Connection.Close(); } finally { Connection.Close(); } } return str; } /// /// 通过存储过程获得DataTable /// /// 存储过程名 /// public static DataTable GetDataTableRunProc(string storedProcName, params SqlParameter[] parameters) { DataTable dataTable = new DataTable(); using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(storedProcName, Connection); command.CommandType = CommandType.StoredProcedure; command.CommandTimeout = 600; if (parameters != null) { command.Parameters.AddRange(parameters); } SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(dataTable); } catch { Connection.Close(); } finally { Connection.Close(); } } return dataTable; } /// /// Will run a stored procedure, can only be called by those classes deriving /// from this base. It returns a SqlDataReader containing the result of the stored /// procedure. /// /// Name of the stored procedure /// Array of parameters to be passed to the procedure /// A newly instantiated SqlDataReader object public static SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters) { SqlDataReader returnReader; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = BuildQueryCommand(storedProcName, parameters); command.CommandType = CommandType.StoredProcedure; returnReader = command.ExecuteReader(); } finally { Connection.Close(); } } return returnReader; } /// /// 通过存储过程获得DataTable /// /// sql字符串 /// public static DataTable GetDataTableRunText(string strSql, params SqlParameter[] parameters) { DataTable dataTable = new DataTable(); using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(strSql, Connection); command.CommandType = CommandType.Text; command.CommandTimeout = 600; if (parameters != null) { command.Parameters.AddRange(parameters); } SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(dataTable); } catch { Connection.Close(); } finally { Connection.Close(); } } return dataTable; } /// /// 获取字符串 /// /// sql语句 /// 字符串 public static string getStr(string sql, IDataParameter[] parameters) { string str = ""; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(sql, Connection); command.CommandType = CommandType.Text; if (parameters != null) { command.Parameters.AddRange(parameters); } str = command.ExecuteScalar().ToString(); } catch { Connection.Close(); } finally { Connection.Close(); } } return str; } /// /// 执行SQL语句 /// /// sql语句 public static void ExecutSql(string sql) { using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(sql, Connection); command.CommandType = CommandType.Text; command.ExecuteNonQuery(); } catch { Connection.Close(); } finally { Connection.Close(); } } } /// /// 执行带参数的SQL语句 /// /// /// public static void ExecutSql(string sql, IDataParameter[] parameters) { using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(sql, Connection); command.CommandType = CommandType.Text; if (parameters != null) { command.Parameters.AddRange(parameters); } command.ExecuteNonQuery(); } catch { Connection.Close(); } finally { Connection.Close(); } } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// Creates a DataSet by running the stored procedure and placing the results /// of the query/proc into the given tablename. /// /// /// /// /// public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName) { DataSet dataSet = new DataSet(); using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = BuildQueryCommand(storedProcName, parameters); sqlDA.Fill(dataSet, tableName); } catch { Connection.Close(); } finally { Connection.Close(); } } return dataSet; } /// /// Takes an -existing- dataset and fills the given table name with the results /// of the stored procedure. /// /// /// /// /// /// public static void RunProcedure(string storedProcName, IDataParameter[] parameters, DataSet dataSet, string tableName) { using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = BuildIntCommand(storedProcName, parameters); sqlDA.Fill(dataSet, tableName); } catch { Connection.Close(); } finally { Connection.Close(); } } } /// /// 用于简单的Sql查询,返回DataSet /// /// /// /// public static DataSet RunSqlString(string strSql, string tableName) { DataSet dataSet = new DataSet(); using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(strSql, Connection); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = command; sqlDA.Fill(dataSet, tableName); } catch { Connection.Close(); } finally { Connection.Close(); } } return dataSet; } /// /// 用于简单的Sql查询 /// /// /// /// public static void RunProcedure(string strSql, DataSet dataSet, string tableName) { using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(strSql, Connection); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = command; sqlDA.Fill(dataSet, tableName); } catch { Connection.Close(); } finally { Connection.Close(); } } } /// /// 用于简单的Sql执行,不返回值,用于数据操作类型的 /// /// /// public static void RunSqlString(string strSql,out int result) { using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(strSql, Connection); command.CommandType = CommandType.Text; result = command.ExecuteNonQuery(); } catch { result = -1; Connection.Close(); } finally { Connection.Close(); } } } /* public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName ) { DataSet dataSet = new DataSet(); if (Connection.State == ConnectionState.Open) Connection.Close(); Connection.Open(); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = BuildQueryCommand( storedProcName, parameters ); sqlDA.Fill( dataSet, tableName ); Connection.Close(); return dataSet; }*/ /// 返回存储过程执行的结果集 /// /// 存储过程名称 /// 存储过程的{参数--值}的集合 // 返回存储过程执行的结果集。 public static DataTable RunProcedureGetTable(string pur_name, Hashtable parmList) { DataTable dt = new DataTable(); DataRow dr; using (SqlConnection Connection = new SqlConnection(connectionString)) { // 调用存储过程pur_name。 SqlCommand sqlCmd = new SqlCommand(pur_name, Connection); sqlCmd.CommandType = CommandType.StoredProcedure; // 为输入参数赋值。 foreach (string parm in parmList.Keys) { sqlCmd.Parameters.Add(new SqlParameter("@" + parm, parmList[parm])); } // 打开连接。 sqlCmd.Connection.Open(); SqlDataReader dreader = null; try { dreader = sqlCmd.ExecuteReader(); for (int i = 0; i < dreader.FieldCount; i++) { DataColumn myDataColumn; myDataColumn = new DataColumn(); myDataColumn.DataType = System.Type.GetType(dreader.GetFieldType(i).ToString()); myDataColumn.ColumnName = dreader.GetName(i); myDataColumn.Caption = dreader.GetName(i); dt.Columns.Add(myDataColumn); } while (dreader.Read()) { dr = dt.NewRow(); for (int i = 0; i < dreader.FieldCount; i++) { dr[i] = dreader[i]; } dt.Rows.Add(dr); } dreader.Close(); } catch (Exception ex) { sqlCmd.Connection.Close(); string str = ex.Message.ToString(); // 不成功则给出提示。 throw new Exception(ex.ToString()); } finally { // 关闭连接。 sqlCmd.Connection.Close(); } } return dt; } /// /// sql串 /// sql{参数--值}的集合 public static DataTable RunSqlGetTable(string strSql) { DataTable dt = new DataTable(); DataRow dr; using (SqlConnection Connection = new SqlConnection(connectionString)) { // 调用存储过程pur_name。 SqlCommand sqlCmd = new SqlCommand(strSql, Connection); // 打开连接。 sqlCmd.Connection.Open(); SqlDataReader dreader = null; try { dreader = sqlCmd.ExecuteReader(); for (int i = 0; i < dreader.FieldCount; i++) { DataColumn myDataColumn; myDataColumn = new DataColumn(); myDataColumn.DataType = System.Type.GetType(dreader.GetFieldType(i).ToString()); myDataColumn.ColumnName = dreader.GetName(i); myDataColumn.Caption = dreader.GetName(i); dt.Columns.Add(myDataColumn); } while (dreader.Read()) { dr = dt.NewRow(); for (int i = 0; i < dreader.FieldCount; i++) { dr[i] = dreader[i]; } dt.Rows.Add(dr); } dreader.Close(); } catch (Exception ex) { sqlCmd.Connection.Close(); // 不成功则给出提示。 throw new Exception(ex.ToString()); } finally { // 关闭连接。 sqlCmd.Connection.Close(); } return dt; } } /// 返回存储过程执行的结果集 /// /// 存储过程名称 /// 存储过程的{参数--值}的集合 public static void RunProcedure(string pur_name,Hashtable parmList) { using (SqlConnection Connection = new SqlConnection(connectionString)) { // 调用存储过程pur_name。 SqlCommand sqlCmd = new SqlCommand(pur_name, Connection); sqlCmd.CommandType = CommandType.StoredProcedure; // 为输入参数赋值。 foreach (string parm in parmList.Keys) { sqlCmd.Parameters.Add(new SqlParameter("@" + parm, parmList[parm])); } // 打开连接。 sqlCmd.Connection.Open(); try { sqlCmd.ExecuteNonQuery(); } catch (Exception ex) { sqlCmd.Connection.Close(); // 不成功则给出提示。 throw new Exception(ex.ToString()); } finally { // 关闭连接。 sqlCmd.Connection.Close(); } } } /// 返回存储过程执行的结果集 /// /// 存储过程名称 /// 存储过程的{参数--值}的集合 public static void RunProcedure(string pur_name,Hashtable parmList ,ref int returnValue) { using (SqlConnection Connection = new SqlConnection(connectionString)) { // 调用存储过程pur_name。 SqlCommand sqlCmd = new SqlCommand(pur_name, Connection); sqlCmd.CommandType = CommandType.StoredProcedure; // 为输入参数赋值。 foreach (string parm in parmList.Keys) { sqlCmd.Parameters.Add(new SqlParameter("@" + parm, parmList[parm])); } // 打开连接。 sqlCmd.Connection.Open(); try { returnValue = sqlCmd.ExecuteNonQuery(); } catch (Exception ex) { sqlCmd.Connection.Close(); // 不成功则给出提示。 throw new Exception(ex.ToString()); } finally { // 关闭连接。 sqlCmd.Connection.Close(); } } } private static void AddParameterToCommand(SqlCommand cmd,SqlParameter[] param) { foreach(SqlParameter p in param) { cmd.Parameters.Add(p); } } private static SqlCommand CreateCommand(CommandType commandType, string commandText, SqlParameter[] param) { SqlCommand cmd = new SqlCommand(); using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); cmd.CommandType = commandType; cmd.Connection = Connection; if (param != null) { AddParameterToCommand(cmd, param); } cmd.CommandText = commandText; } catch { Connection.Close(); } finally { Connection.Close(); } } return cmd; } public static int ExecuteCommand(CommandType commandType, string commandText, SqlParameter[] param) { SqlCommand cmd = CreateCommand(commandType, commandText, param); SqlTransaction trans = null; int i = 0; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { cmd.Connection.Open(); trans = cmd.Connection.BeginTransaction(); cmd.Transaction = trans; i = cmd.ExecuteNonQuery(); trans.Commit(); } catch (Exception ex) { trans.Rollback(); cmd.Connection.Close(); throw ex; } finally { cmd.Connection.Close(); } } return i; } public static DataTable GetSqlDataReaderToDataTable(string strSql, params SqlParameter[] parameters) { // 定义DataTable DataTable datatable = new DataTable(); using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(strSql, Connection); command.CommandType = CommandType.Text; command.CommandTimeout = 600; if (parameters != null) { command.Parameters.AddRange(parameters); } SqlDataReader dataReader = null; dataReader = command.ExecuteReader(CommandBehavior.CloseConnection); ///动态添加表的数据列 for (int i = 0; i < dataReader.FieldCount; i++) { DataColumn myDataColumn = new DataColumn(); myDataColumn.DataType = dataReader.GetFieldType(i); myDataColumn.ColumnName = dataReader.GetName(i); datatable.Columns.Add(myDataColumn); } // 添加表的数据 while (dataReader.Read()) { DataRow myDataRow = datatable.NewRow(); for (int i = 0; i < dataReader.FieldCount; i++) { myDataRow[i] = dataReader[i].ToString(); } datatable.Rows.Add(myDataRow); myDataRow = null; } ///关闭数据读取器 dataReader.Close(); } catch { Connection.Close(); } finally { Connection.Close(); } } return datatable; } /// /// 创建一个对象锁 /// private static object newIdLocker = new object(); /// /// 生成一个新的用于指定表的主键。 /// /// /// public static string GetNewID(Type table) { lock (newIdLocker) { return Guid.NewGuid().ToString(); } } public static string GetNewID() { lock (newIdLocker) { return Guid.NewGuid().ToString(); } } /// /// 表数据中的主键最大值 /// /// 表名 /// 主键名 /// 主键最大值 public static int GetMaxId(string tableName, string ColumnName) { int maxId = 0; string str = "SELECT (ISNULL(MAX(" + ColumnName + "),0)+1) from " + tableName + ""; maxId = getIntValue(str); return maxId; } public static int getIntValue(string sql) { int i = 0; using (SqlConnection Connection = new SqlConnection(connectionString)) { try { Connection.Open(); SqlCommand command = new SqlCommand(sql, Connection); command.CommandType = CommandType.Text; i = Convert.ToInt32(command.ExecuteScalar()); } finally { Connection.Close(); } } return i; } } }