/** * * SQLSERVER辅助类,封装对SQLSERVER的各种操作. * * Author FeiLong Wang (hustemb@gmail.com) * Copyright (c) 2006. All Rights Reserved. * LastModifiedDate:2008-1-26 * * */ using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Collections; using System.Collections.Generic; namespace WMS.DBUtility { public class SqlServerHelper : IDisposable { #region Varibales // 适配器 // 数据库连接字符串 private static readonly string m_connectionString = ConfigurationManager.ConnectionStrings["wmsConnString"].ConnectionString; /// Parameters缓存哈希表 public static string ConnectionString { get { return SqlServerHelper.m_connectionString; } } #endregion #region Contructors /// /// 释放对象资源 /// public void Dispose() { GC.SuppressFinalize(true); } #endregion #region ExecuteNonQuery /// /// 直接执行SQL语句 /// 示例: /// int result = ExecuteNonQuery("SELECT * FROM [table123]"); /// /// SQL语句 /// 返回命令影响的行数 public static int ExecuteNonQuery(string commandText) { return ExecuteNonQuery(CommandType.Text, commandText); } /// /// 执行指定连接字符串,类型的SqlCommand. /// /// /// 示例: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本, 其它.) /// 存储过程名称或SQL语句 /// 返回命令影响的行数 public static int ExecuteNonQuery(CommandType commandType, string commandText) { return ExecuteNonQuery(commandType, commandText, (SqlParameter[])null); } /// /// 执行指定连接字符串,类型的SqlCommand.如果没有提供参数,不返回结果. /// /// /// 示例: /// int result = ExecuteNonQuery(CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本, 其它.) /// 存储过程名称或SQL语句 /// SqlParameter参数数组 /// 返回命令影响的行数 public static int ExecuteNonQuery(CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (m_connectionString == null || m_connectionString.Length == 0) throw new ArgumentNullException("ConnectionString"); using (SqlConnection connection = new SqlConnection(m_connectionString)) { connection.ConnectionString = m_connectionString; connection.Open(); return ExecuteNonQuery(connection, commandType, commandText, commandParameters); } } /// /// 执行指定数据库连接对象的命令 /// /// /// 示例: /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// 存储过程名称或SQL语句 /// 返回影响的行数 public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText) { return ExecuteNonQuery(connection, commandType, commandText, (SqlParameter[])null); } /// /// 执行带事务的SqlCommand. /// /// /// 示例.: /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// 存储过程名称或SQL语句 /// 返回影响的行数/returns> public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText) { return ExecuteNonQuery(transaction, commandType, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接对象的命令 /// /// /// 示例: /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// T存储过程名称或SQL语句 /// SqlParamter参数数组 /// 返回影响的行数 public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (connection == null) throw new ArgumentNullException("connection"); // 创建SqlCommand命令,并进行预处理 SqlCommand cmd = new SqlCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); // Finally, execute the command int retval = cmd.ExecuteNonQuery(); // 清除参数,以便再次使用. cmd.Parameters.Clear(); if (mustCloseConnection) connection.Close(); return retval; } /// /// 执行带事务的SqlCommand(指定参数). /// /// /// 示例: /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型(存储过程,命令文本或其它.) /// 存储过程名称或SQL语句 /// SqlParamter参数数组 /// 返回影响的行数 public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (transaction == null) throw new ArgumentNullException("transaction"); if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); // 预处理 SqlCommand cmd = new SqlCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 执行 int retval = cmd.ExecuteNonQuery(); // 清除参数集,以便再次使用. cmd.Parameters.Clear(); return retval; } #endregion #region ExecuteDataTable /// /// 执行指定数据库连接字符串的命令,返回DataTable. /// /// /// 示例: /// DataTable dt = ExecuteDataTable("SELECT * FROM [table1]"); /// /// SQL语句 /// 返回一个包含结果集的DataTable public static DataTable ExecuteDataTable(string commandText) { return ExecuteDataTable(CommandType.Text, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接字符串的命令,返回DataTable. /// /// /// 示例: /// DataTable dt = ExecuteDataTable(connString, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回一个包含结果集的DataTable public static DataTable ExecuteDataTable(CommandType commandType, string commandText) { return ExecuteDataTable(commandType, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接字符串的命令,返回DataTable. /// /// /// 示例: /// DataTable dt = ExecuteDataTable(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// SqlParamters参数数组 /// 返回一个包含结果集的DataTable public static DataTable ExecuteDataTable(CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (m_connectionString == null || m_connectionString.Length == 0) throw new ArgumentNullException("ConnectionString"); // 创建并打开数据库连接对象,操作完成释放对象. using (SqlConnection connection = new SqlConnection(m_connectionString)) { connection.ConnectionString = m_connectionString; connection.Open(); // 调用指定数据库连接字符串重载方法. return ExecuteDataTable(connection, commandType, commandText, commandParameters); } } /// /// 执行指定数据库连接对象的命令,返回DataTable. /// /// /// 示例: /// DataTable dt = ExecuteDataTable(conn, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回一个包含结果集的DataTable public static DataTable ExecuteDataTable(SqlConnection connection, CommandType commandType, string commandText) { return ExecuteDataTable(connection, commandType, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataTable. /// /// /// 示例: /// DataTable dt = ExecuteDataTable(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组 /// 返回一个包含结果集的DataTable public static DataTable ExecuteDataTable(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (connection == null) throw new ArgumentNullException("connection"); // 预处理 SqlCommand cmd = new SqlCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); // 创建SqlDataAdapter和DataTable. using (SqlDataAdapter da = new SqlDataAdapter()) { da.SelectCommand = cmd; DataTable tab = new DataTable(); try { // 填充DataTable. da.Fill(tab); cmd.Parameters.Clear(); if (mustCloseConnection) connection.Close(); } catch (Exception ex) { string errMsg = ex.Message; } return tab; } } /// /// 执行指定事务的命令,返回DataTable. /// /// /// 示例: /// DataTable dt = ExecuteDataTable(trans, CommandType.StoredProcedure, "GetOrders"); /// /// 事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回一个包含结果集的DataTable public static DataTable ExecuteDataTable(SqlTransaction transaction, CommandType commandType, string commandText) { return ExecuteDataTable(transaction, commandType, commandText, (SqlParameter[])null); } /// /// 执行指定事务的命令,指定参数,返回DataTable. /// /// /// 示例: /// DataTable dt = ExecuteDataTable(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组 /// 返回一个包含结果集的DataTable public static DataTable ExecuteDataTable(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (transaction == null) throw new ArgumentNullException("transaction"); if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); // 预处理 SqlCommand cmd = new SqlCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 创建 DataAdapter & DataTable using (SqlDataAdapter da = new SqlDataAdapter()) { da.SelectCommand = cmd; DataTable dt = new DataTable(); da.Fill(dt); cmd.Parameters.Clear(); return dt; } } #endregion #region ExecuteDataSet /// /// 执行指定数据库连接字符串的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataSet("SELECT * FROM [table1]"); /// /// SQL语句 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataSet(string commandText) { return ExecuteDataSet(CommandType.Text, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接字符串的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataSet(connString, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataSet(CommandType commandType, string commandText) { return ExecuteDataSet(commandType, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接字符串的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataSet(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// SqlParamters参数数组 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataSet(CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (m_connectionString == null || m_connectionString.Length == 0) throw new ArgumentNullException("ConnectionString"); // 创建并打开数据库连接对象,操作完成释放对象. using (SqlConnection connection = new SqlConnection(m_connectionString)) { connection.ConnectionString = m_connectionString; connection.Open(); // 调用指定数据库连接字符串重载方法. return ExecuteDataSet(connection, commandType, commandText, commandParameters); } } /// /// 执行指定数据库连接对象的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataSet(conn, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataSet(SqlConnection connection, CommandType commandType, string commandText) { return ExecuteDataSet(connection, commandType, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataSet(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataSet(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { try { if (connection == null) throw new ArgumentNullException("connection"); // 预处理 SqlCommand cmd = new SqlCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); // 创建SqlDataAdapter和DataSet. using (SqlDataAdapter da = new SqlDataAdapter()) { da.SelectCommand = cmd; DataSet ds = new DataSet(); // 填充DataSet. da.Fill(ds); cmd.Parameters.Clear(); if (mustCloseConnection) connection.Close(); return ds; } } catch (Exception exp) { throw exp; } } /// /// 执行指定事务的命令,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataSet(trans, CommandType.StoredProcedure, "GetOrders"); /// /// 事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataSet(SqlTransaction transaction, CommandType commandType, string commandText) { return ExecuteDataSet(transaction, commandType, commandText, (SqlParameter[])null); } /// /// 执行指定事务的命令,指定参数,返回DataSet. /// /// /// 示例: /// DataSet ds = ExecuteDataSet(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组 /// 返回一个包含结果集的DataSet public static DataSet ExecuteDataSet(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (transaction == null) throw new ArgumentNullException("transaction"); if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); // 预处理 SqlCommand cmd = new SqlCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 创建 DataAdapter & DataSet using (SqlDataAdapter da = new SqlDataAdapter()) { da.SelectCommand = cmd; DataSet ds = new DataSet(); da.Fill(ds); cmd.Parameters.Clear(); return ds; } } #endregion #region ExecuteScalar /// /// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar("SELECT MAX(PK_ID) FROM [table123]"); /// /// SQL语句 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(string commandText) { // 执行参数为空的方法 return ExecuteScalar(CommandType.Text, commandText); } /// /// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(CommandType commandType, string commandText) { // 执行参数为空的方法 return ExecuteScalar(commandType, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接字符串的命令,指定参数,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 分配给命令的SqlParamter参数数组 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (ConnectionString == null || ConnectionString.Length == 0) throw new ArgumentNullException("ConnectionString"); // 创建并打开数据库连接对象,操作完成释放对象. using (SqlConnection connection = new SqlConnection(m_connectionString)) { connection.ConnectionString = ConnectionString; connection.Open(); // 调用指定数据库连接字符串重载方法. return ExecuteScalar(connection, commandType, commandText, commandParameters); } } /// /// 执行指定数据库连接对象的命令,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText) { // 执行参数为空的方法 return ExecuteScalar(connection, commandType, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接对象的命令,指定参数,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 分配给命令的SqlParamter参数数组 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (connection == null) throw new ArgumentNullException("connection"); // 创建SqlCommand命令,并进行预处理 SqlCommand cmd = new SqlCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); // 执行SqlCommand命令,并返回结果. object retval = cmd.ExecuteScalar(); // 清除参数,以便再次使用. cmd.Parameters.Clear(); if (mustCloseConnection) connection.Close(); return retval; } /// /// 执行指定数据库事务的命令,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText) { // 执行参数为空的方法 return ExecuteScalar(transaction, commandType, commandText, (SqlParameter[])null); } /// /// 执行指定数据库事务的命令,指定参数,返回结果集中的第一行第一列. /// /// /// 示例: /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24)); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 分配给命令的SqlParamter参数数组 /// 返回结果集中的第一行第一列 public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (transaction == null) throw new ArgumentNullException("transaction"); if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); // 创建SqlCommand命令,并进行预处理 SqlCommand cmd = new SqlCommand(); bool mustCloseConnection = false; PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 执行SqlCommand命令,并返回结果. object retval = cmd.ExecuteScalar(); // 清除参数,以便再次使用. cmd.Parameters.Clear(); return retval; } #endregion #region ExecuteReader /// /// 执行指定数据库连接字符串的数据阅读器. /// /// /// 示例: /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回包含结果集的SqlDataReader public static SqlDataReader ExecuteReader(string commandText) { return ExecuteReader(CommandType.Text, commandText); } /// /// 执行指定数据库连接字符串的数据阅读器. /// /// /// 示例: /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回包含结果集的SqlDataReader public static SqlDataReader ExecuteReader(CommandType commandType, string commandText) { return ExecuteReader(commandType, commandText, (SqlParameter[])null); } /// /// 执行指定数据库连接字符串的数据阅读器,指定参数. /// /// /// 示例: /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接字符串 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParamter参数数组(new SqlParameter("@prodid", 24)) /// 返回包含结果集的SqlDataReader public static SqlDataReader ExecuteReader(CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (m_connectionString == null || m_connectionString.Length == 0) throw new ArgumentNullException("ConnectionString"); SqlConnection connection = null; try { connection = new SqlConnection(m_connectionString); connection.ConnectionString = m_connectionString; connection.Open(); return ExecuteReader(connection, null, commandType, commandText, commandParameters, SqlConnectionOwnership.Internal); } catch (Exception exp) { // If we fail to return the SqlDatReader, we need to close the connection ourselves if (connection != null) connection.Close(); throw exp; } } /// /// 执行指定数据库连接对象的数据阅读器. /// /// /// 示例: /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// 返回包含结果集的SqlDataReader public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText) { return ExecuteReader(connection, commandType, commandText, (SqlParameter[])null); } /// /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数. /// /// /// 示例: /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的数据库连接对象 /// 命令类型 (存储过程,命令文本或其它) /// 命令类型 (存储过程,命令文本或其它) /// SqlParamter参数数组 /// 返回包含结果集的SqlDataReader public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { return ExecuteReader(connection, (SqlTransaction)null, commandType, commandText, commandParameters, SqlConnectionOwnership.External); } /// /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值. /// /// /// 示例: /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 返回包含结果集的SqlDataReader public static SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType, string commandText) { return ExecuteReader(transaction, commandType, commandText, (SqlParameter[])null); } /// /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数. /// /// /// 示例: /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); /// /// 一个有效的连接事务 /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名称或SQL语句 /// 分配给命令的SqlParamter参数数组 /// 返回包含结果集的SqlDataReader public static SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) { if (transaction == null) throw new ArgumentNullException("transaction"); if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, SqlConnectionOwnership.External); } /// /// 枚举,标识数据库连接是由BaseSqlHelper提供还是由调用者提供 /// private enum SqlConnectionOwnership { /// 由BaseSqlHelper提供连接 Internal, /// 由调用者提供连接 External } /// /// 执行指定数据库连接对象的数据阅读器. /// /// /// 如果是BaseSqlHelper打开连接,当连接关闭DataReader也将关闭. /// 如果是调用都打开连接,DataReader由调用都管理. /// /// 一个有效的数据库连接对象 /// 一个有效的事务,或者为 'null' /// 命令类型 (存储过程,命令文本或其它) /// 存储过程名或SQL语句 /// SqlParameters参数数组,如果没有参数则为'null' /// 标识数据库连接对象是由调用者提供还是由BaseSqlHelper提供 /// 返回包含结果集的SqlDataReader private static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership) { if (connection == null) throw new ArgumentNullException("connection"); bool mustCloseConnection = false; // 创建命令 SqlCommand cmd = new SqlCommand(); try { PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); // 创建数据阅读器 SqlDataReader dataReader; if (connectionOwnership == SqlConnectionOwnership.External) { dataReader = cmd.ExecuteReader(); } else { dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } // 清除参数,以便再次使用.. // HACK There is a problem here, the output parameter values are fletched // when the reader is closed, so if the parameters are detached from the command // then the SqlReader can set its values. // When this happen, the parameters can be used again in other command. bool canClear = true; foreach (SqlParameter commandParameter in cmd.Parameters) { if (commandParameter.Direction != ParameterDirection.Input) canClear = false; } if (canClear) { cmd.Parameters.Clear(); } return dataReader; } catch (Exception exp) { if (mustCloseConnection) connection.Close(); throw exp; } } #endregion #region Common Utility /// /// 预处理用户提供的命令,数据库连接/事务/命令类型/参数 /// /// 要处理的SqlCommand /// 数据库连接 /// 一个有效的事务或者是null值 /// 命令类型 (存储过程,命令文本, 其它.) /// 存储过程名或都SQL命令文本 /// 和命令相关联的SqlParameter参数数组,如果没有参数为'null' /// true 如果连接是打开的,则为true,其它情况下为false. private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, out bool mustCloseConnection) { if (command == null) throw new ArgumentNullException("command"); if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText"); // 如果连接没有打开则打开连接 if (connection.State != ConnectionState.Open) { mustCloseConnection = true; connection.Open(); } else { mustCloseConnection = false; } // 给命令分配一个数据库连接. command.Connection = connection; // 设置命令文本(存储过程名或SQL语句) command.CommandText = commandText; // 分配事务 if (transaction != null) { if (transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); command.Transaction = transaction; } // 设置命令类型. command.CommandType = commandType; // 分配命令参数 if (commandParameters != null) { command.Parameters.Clear(); foreach (SqlParameter parm in commandParameters) command.Parameters.Add(parm); } return; } /// /// 将DataReader转化为DataSet /// /// DataReader数据接口 /// DataSet格式的数据 private static DataSet Reader2Set(IDataReader reader) { DataTable table = new DataTable(); int fieldCount = reader.FieldCount; for (int i = 0; i < fieldCount; i++) { table.Columns.Add(reader.GetName(i), reader.GetFieldType(i)); } table.BeginLoadData(); object[] values = new object[fieldCount]; while (reader.Read()) { reader.GetValues(values); table.LoadDataRow(values, true); } table.EndLoadData(); DataSet ds = new DataSet(); ds.Tables.Add(table); return ds; } /// /// 将DataReader转化为DataTable /// /// DataReader数据接口 /// DataTable格式的数据 private static DataTable Reader2Table(IDataReader reader) { DataTable table = new DataTable(); int fieldCount = reader.FieldCount; for (int i = 0; i < fieldCount; i++) { table.Columns.Add(reader.GetName(i), reader.GetFieldType(i)); } table.BeginLoadData(); object[] values = new object[fieldCount]; while (reader.Read()) { reader.GetValues(values); table.LoadDataRow(values, true); } table.EndLoadData(); return table; } #endregion #region Cache /// /// 追加参数数组到缓存. /// /// 一个有效的数据库连接字符串 /// 存储过程名或SQL语句 /// 要缓存的参数数组 public static void CacheParameterSet(string commandText, params SqlParameter[] commandParameters) { if (ConnectionString == null || ConnectionString.Length == 0) throw new ArgumentNullException("ConnectionString"); if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText"); string hashKey = ConnectionString + ":" + commandText; } /// /// SqlParameter参数数组的深层拷贝. /// /// 原始参数数组 /// 返回一个同样的参数数组 private static SqlParameter[] CloneParameters(SqlParameter[] originalParameters) { SqlParameter[] clonedParameters = new SqlParameter[originalParameters.Length]; for (int i = 0, j = originalParameters.Length; i < j; i++) { clonedParameters[i] = (SqlParameter)((ICloneable)originalParameters[i]).Clone(); } return clonedParameters; } #endregion Cache /// /// 多条SQL语句一块执行的效果 /// /// command类型 /// 存储过程名数组 /// 参数数组 泛型 /// /// public static int ExecuteNonSQLList(CommandType commandType, System.Collections.Generic.List ListCommandText, ref string msg) { return ExecuteNonSQLList(m_connectionString, commandType, ListCommandText, ref msg); } public static int ExecuteNonSQLList(CommandType commandType, System.Collections.Generic.List ListCommandText, List ListSqlParameters, ref string msg) { return ExecuteNonSQLList(m_connectionString, commandType, ListCommandText,ListSqlParameters, ref msg); } ///// ///// 多条SQL语句一块执行的效果 ///// ///// command类型 ///// 存储过程名数组 ///// 参数数组 泛型 ///// ///// //public static int ExecuteNonSQLList(string connectionString, CommandType commandType, System.Collections.Generic.List ListCommandText, ref string msg) //{ // int flag = 0; // if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); // using (SqlConnection sc = new SqlConnection(connectionString)) // { // sc.Open(); // SqlTransaction tran = sc.BeginTransaction(); // for (int i = 0; i < ListCommandText.Count; i++) // { // flag = ExecuteNonQuery(sc, commandType, ListCommandText[i]); // if (flag < 0) // { // //msg = ListCommandParameters[i][ListCommandParameters[i].Length - 1].Value.ToString(); // RollbackTransaction(tran); // return flag; // } // } // CommitTransaction(tran); // return flag; // } //} /// /// 多条SQL语句一块执行的效果 /// /// 连接字符串 /// command类型 /// 存储过程名数组 /// 参数数组 泛型 /// /// public static int ExecuteNonSQLList(string connectionString, CommandType commandType, List ListCommandText,List ListSqlParameters, ref string msg) { int flag = 0; if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); using (SqlConnection sc = new SqlConnection(connectionString)) { sc.Open(); SqlTransaction tran = sc.BeginTransaction(); for (int i = 0; i < ListCommandText.Count; i++) { flag = ExecuteNonQuery(tran, commandType, ListCommandText[i],ListSqlParameters[i]); if (flag < 0) { //msg = ListCommandParameters[i][ListCommandParameters[i].Length - 1].Value.ToString(); RollbackTransaction(tran); return flag; } } CommitTransaction(tran); return flag; } } public static int ExecuteNonSQLList(string connectionString, CommandType commandType, List ListCommandText, ref string msg) { int flag = 0; if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); using (SqlConnection sc = new SqlConnection(connectionString)) { sc.Open(); SqlTransaction tran = sc.BeginTransaction(); for (int i = 0; i < ListCommandText.Count; i++) { flag = ExecuteNonQuery(tran, commandType, ListCommandText[i]); if (flag < 0) { //msg = ListCommandParameters[i][ListCommandParameters[i].Length - 1].Value.ToString(); RollbackTransaction(tran); return flag; } } CommitTransaction(tran); return flag; } } #region Transaction static SqlConnection sc; public static SqlTransaction BeginTransaction(string connectionString) { sc = new SqlConnection(connectionString); if (sc.State != ConnectionState.Open) { sc.Open(); } SqlTransaction tran = sc.BeginTransaction(); return tran; } public static SqlTransaction BeginTransaction() { return BeginTransaction(m_connectionString); } public static void RollbackTransaction(SqlTransaction tran) { if (tran != null) { tran.Rollback(); } if (sc != null) { sc.Close(); } } public static void CommitTransaction(SqlTransaction tran) { string errText = string.Empty; try { if (tran != null) { tran.Commit(); } if (sc != null) { sc.Close(); } } catch (Exception ex) { WMS.Common.LogWriteText.WriteLog(ex.Message.ToString() + ex.InnerException.ToString()); if (sc != null) { sc.Close(); } } } #endregion } }