SqlHelp

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Text;
using System.Configuration;
using System.Linq;

namespace Common
{
    public class SqlHelp
    {
        public delegate T BuildObjectHandler<T>(IDataReader reader);
        public delegate Object BuildObjectHandler1(IDataReader reader);
        private static readonly string ConnStr = ConfigurationManager.AppSettings["ConnectionString"];


        private static object syncLock = new object();
        private static SqlHelp _instance;

        public static SqlHelp Instance()
        {
            if (_instance == null)
            {
                lock (syncLock)
                {
                    if (_instance == null)
                    {
                        _instance = new SqlHelp();
                    }
                }
            }
            return _instance;
        }
        public int ExecuteNonQuery(string commandText)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlCommand command = new SqlCommand(commandText);
                command.Connection = conn;
                return command.ExecuteNonQuery();
            }
        }

        public object ExecuteFrist(string commandText)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlCommand command = new SqlCommand(commandText);
                command.Connection = conn;
                return command.ExecuteScalar();
            }
        }
        public object ExecuteFrist(string commandText, params object[] parameterValues)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlCommand command = GetStoredCommand(commandText, parameterValues);
                command.Connection = conn;
                return command.ExecuteScalar();
            }
        }
        public object ExecuteFrist(string commandText, string ExecuteNonQuery, params SqlParameter[] ps)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlCommand command = new SqlCommand(commandText, conn);

                if (ps != null)
                {
                    command.Parameters.Clear();
                    foreach (IDbDataParameter p in ps)
                    {
                        command.Parameters.Add(p);
                    }
                }
                return Convert.ToInt32(command.ExecuteScalar());
            }
        }

        public int ExecuteNonQuery(string commandText, params SqlParameter[] ps)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                int iRows;
                SqlCommand command = new SqlCommand(commandText, conn);

                if (ps != null)
                {
                    command.Parameters.Clear();
                    foreach (IDbDataParameter p in ps)
                    {
                        command.Parameters.Add(p);
                    }
                }
                iRows = command.ExecuteNonQuery();
                return iRows;
            }
        }

        public int ExecuteQuery(string commandText, params SqlParameter[] ps)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlCommand command = new SqlCommand(commandText, conn);

                if (ps != null)
                {
                    command.Parameters.Clear();
                    foreach (IDbDataParameter p in ps)
                    {
                        command.Parameters.Add(p);
                    }
                }
                return Convert.ToInt32(command.ExecuteScalar());
            }
        }

        public int ExecuteInsert(string commandText, params SqlParameter[] ps)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlCommand command = new SqlCommand(commandText, conn);

                if (ps != null)
                {
                    command.Parameters.Clear();
                    foreach (IDbDataParameter p in ps)
                    {
                        command.Parameters.Add(p);
                    }
                }
                return Convert.ToInt32(command.ExecuteNonQuery());
            }
        }

        public DataTable ExecuteDataTable(string commandText)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                try
                {
                    conn.Open();
                    SqlCommand command = new SqlCommand(commandText);
                    command.Connection = conn;
                    using (IDataReader dr = command.ExecuteReader())
                    {
                        DataTable dt = new DataTable("row");
                        dt.Load(dr);
                        conn.Close();
                        return dt;
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    conn.Close();
                }

            }
        }

        public IDataReader ExecuteProduceReader(string storedProcedureName, params object[] parameterValues)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlCommand command = GetStoredCommand(storedProcedureName, parameterValues);
                command.Connection = conn;
                return command.ExecuteReader();
            }
        }

        public int ExecuteProduce(string produceName, params object[] parameterValues)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                SqlCommand command = GetStoredCommand(produceName, parameterValues);
                command.Connection = conn;
                return command.ExecuteNonQuery();
            }
        }

        public string ExecuteProduceReturn(string produceName, params object[] parameterValues)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();

                SqlCommand command = GetStoredCommand(produceName, parameterValues);
                command.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
                command.Connection = conn;
                command.ExecuteNonQuery();
                return command.Parameters["@return"].Value.ToString();
            }
        }

        public int ExecuteProduceReturnInt(string produceName, params object[] parameterValues)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();

                SqlCommand command = GetStoredCommand(produceName, parameterValues);
                command.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));
                command.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
                command.Connection = conn;
                command.ExecuteNonQuery();
                return int.Parse(command.Parameters["@return"].Value.ToString());
            }
        }


        public DataTable GetProduceDataTable(string cmdText, CommandType cmdType, SqlParameter[] cmdParms)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
               
                conn.Open();
                SqlDataReader reader;
                DataTable dt = new DataTable();
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    SetCommand(cmd, cmdText, cmdType,conn, cmdParms);
                    reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    dt.Load(reader);
                    reader.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message.ToString());
                }
                return dt;
            }
        }

        public DataTable GetProduceDataTableAndOutput(string cmdText, CommandType cmdType, SqlParameter[] cmdParms,out string output)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {

                conn.Open();
                SqlDataReader reader;
                DataTable dt = new DataTable();
                try
                {
                    SqlCommand cmd = new SqlCommand();
                    SetCommand(cmd, cmdText, cmdType, conn, cmdParms);
                    cmd.Parameters.Add(new SqlParameter("@outPut", SqlDbType.VarChar, 60));
                    cmd.Parameters["@outPut"].Direction = ParameterDirection.Output;
                    reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    dt.Load(reader);
                    output=cmd.Parameters["@outPut"].Value.ToString();
                    reader.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message.ToString());
                }
                return dt;
            }
        }
        public string ExecuteProduceOutPut(string produceName, params object[] parameterValues)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();

                SqlCommand command = GetStoredCommand(produceName, parameterValues);
                command.Parameters.Add(new SqlParameter("@outPut", SqlDbType.VarChar, 60));
                command.Parameters["@outPut"].Direction = ParameterDirection.Output;

                command.Connection = conn;
                command.ExecuteNonQuery();
                return command.Parameters["@outPut"].Value.ToString();
            }
        }


        public int ExecuteProduceReturnOutPut(string produceName, out string outStr, params object[] parameterValues)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();

                SqlCommand command = GetStoredCommand(produceName, parameterValues);
                command.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));
                command.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
                command.Parameters.Add(new SqlParameter("@outPut", SqlDbType.VarChar, 8000));
                command.Parameters["@outPut"].Direction = ParameterDirection.Output;

                command.Connection = conn;
                command.ExecuteNonQuery();
                outStr = command.Parameters["@outPut"].Value.ToString();
                string ret = command.Parameters["@return"].Value.ToString();
                return int.Parse(ret);
            }
        }

        /// <summary>
        /// 获取存储过程命令
        /// </summary>
        /// <param name="storedProcedureName"></param>
        /// <param name="parameterValues"></param>
        /// <returns></returns>
        public SqlCommand GetStoredCommand(string storedProcedureName, params object[] parameterValues)
        {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = storedProcedureName;
            cmd.Parameters.Clear();
            if (parameterValues != null && parameterValues.Length > 0)
            {
                for (int i = 0; i < parameterValues.Length; i++)
                {
                    cmd.Parameters.Add(parameterValues[i]);
                }
            }
            return cmd;
        }
 
        public IList<T> ExecuteQueryToList<T>(string sqlStr, BuildObjectHandler<T> buildObj)
        {
            IList<T> sets = new List<T>();
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = new SqlCommand(sqlStr, conn);

                try
                {
                    conn.Open();
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            sets.Add(buildObj(dr));
                        }
                        dr.Close();
                    }
                }
                catch (Exception)
                {
                    conn.Close();
                    throw;
                }
            }
            return sets;
        }

        /// <summary>
        /// 存储过程返回list集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sqlStr"></param>
        /// <param name="buildObj"></param>
        /// <returns></returns>
        public IList<T> ExecuteQueryToListByProcedure<T>(string storedProcedureName, BuildObjectHandler<T> buildObj, params object[] parameterValues)
        {
            IList<T> sets = new List<T>();
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = GetStoredCommand(storedProcedureName, parameterValues);
                cmd.CommandTimeout = 180;
                cmd.Connection = conn;
                try
                {
                    conn.Open();
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            sets.Add(buildObj(dr));
                        }
                        dr.Close();
                    }
                }
                catch (Exception)
                {
                    conn.Close();
                    throw;
                }
            }
            return sets;
        }


        public T ExecuteQueryToFirst<T>(string sqlStr, BuildObjectHandler<T> buildObj)
        {
            IList<T> sets = new List<T>();
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = new SqlCommand(sqlStr, conn);

                try
                {
                    conn.Open();
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            
                            sets.Add(buildObj(dr));
                            break;
                        }
                        dr.Close();
                    }
                }
                catch (Exception)
                {
                    conn.Close();
                    throw;
                }
            }
            return sets.First();
        }


        public Object ExecuteQueryToFirstAndReturn(string proName, out int returnVal, BuildObjectHandler1 buildObj, params object[] parameterValues)
        {
            IList<Object> sets = new List<Object>();
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = GetStoredCommand(proName, parameterValues);
                cmd.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
                cmd.Connection = conn;
                conn.Open();
                //cmd.ExecuteNonQuery();
                //returnVal = 0;
                try
                {

                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            sets.Add(buildObj(dr));

                            break;
                        }

                        dr.Close();
                        returnVal = int.Parse(cmd.Parameters["@return"].Value.ToString());
                    }
                }
                catch (Exception)
                {
                    conn.Close();
                    throw;
                }
            }
            if (sets.Count == 0)
            {
                return null;
            }

            return sets.First();
        }
        //根据父ID找出所有的子节点
        public string GetChildIDStr(string tabName, string pKey, string parentName, int parentID)
        {
            StringBuilder sqlStr = new StringBuilder();
            sqlStr.Append("create table #lsb(id int)  ");
            sqlStr.Append(string.Format("insert into #lsb values({0}) ", parentID));
            sqlStr.Append(string.Format("insert into #lsb select {0} from {1} where {2}={3}    ", pKey, tabName,
                                        parentName, parentID));
            sqlStr.Append(" while @@rowcount>0   ");
            sqlStr.Append(
                string.Format(
                    "insert into #lsb select a.{0} from {1} a inner join #lsb b on a.{2}=b.id where a.{0} not in (select id from #lsb)",
                    pKey, tabName, parentName));
            sqlStr.Append("   select id from #lsb  ");
            sqlStr.Append("  drop table #lsb");
            string childSr = "";
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = new SqlCommand(sqlStr.ToString(), conn);
                try
                {
                    conn.Open();
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            childSr = childSr + dr[0].ToString() + ",";
                        }
                        dr.Close();

                    }
                }
                catch (Exception)
                {
                    conn.Close();
                    throw;
                }
                return childSr.Trim(',');
            }
        }


        public Dictionary<string, string> GetDictionary(string sqlStr)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                SqlCommand cmd = new SqlCommand(sqlStr, conn);
                try
                {
                    conn.Open();

                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            dic.Add(dr[0].ToString(), dr[1].ToString());
                        }
                        dr.Close();

                    }
                }
                catch (Exception)
                {
                    conn.Close();
                    throw;
                }
            }
            return dic;
        }

        public SqlConnection GetConnection()
        {
            SqlConnection conn = new SqlConnection(ConnStr);
            return conn;
        }

        public bool ExecuteTrasaction(string sqlStr, IList<SqlParameter> param)
        {
            SqlTransaction tran = null;
            try
            {
                using (SqlConnection conn = GetConnection())
                {
                    conn.Open();
                    SqlCommand cmd;
                    tran = conn.BeginTransaction();
                    if (param.Count > 0)
                    {
                        cmd = new SqlCommand(sqlStr, conn, tran);
                        foreach (var sqlParam in param)
                        {
                            if (sqlParam != null)
                            {
                                cmd.Parameters.Add(sqlParam);
                            }

                        }
                        cmd.ExecuteNonQuery();
                        tran.Commit();
                    }

                    return true;
                }
            }
            catch
            {
                tran.Rollback();
            }
            return false;
        }
        /// <summary>
        /// Execute a SqlCommand (that returns a resultset) against the specified SqlConnection 
        /// using the provided parameters.
        /// </summary>
        /// <remarks>
        /// e.g.:  
        ///  DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
        /// </remarks>
        /// <param name="connection">a valid SqlConnection</param>
        /// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
        /// <param name="commandText">the stored procedure name or T-SQL command</param>
        /// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
        /// <returns>a dataset containing the resultset generated by the command</returns>
        public DataSet ExecuteDataset(CommandType commandType, string commandText, params SqlParameter[] commandParameters)
        {

            SqlConnection connection = new SqlConnection(ConnStr);
            //create a command and prepare it for execution
            SqlCommand cmd = new SqlCommand();
            PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);

            //create the DataAdapter & DataSet
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();

            //fill the DataSet using default values for DataTable names, etc.
            da.Fill(ds);

            // detach the SqlParameters from the command object, so they can be used again.            
            cmd.Parameters.Clear();
            connection.Close();
            connection.Dispose();
            //return the dataset
            return ds;

        }
        /// <summary>
        /// This method opens (if necessary) and assigns a connection, transaction, command type and parameters 
        /// to the provided command.
        /// </summary>
        /// <param name="command">the SqlCommand to be prepared</param>
        /// <param name="connection">a valid SqlConnection, on which to execute this command</param>
        /// <param name="transaction">a valid SqlTransaction, or 'null'</param>
        /// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
        /// <param name="commandText">the stored procedure name or T-SQL command</param>
        /// <param name="commandParameters">an array of SqlParameters to be associated with the command or 'null' if no parameters are required</param>
        private void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters)
        {
            //if the provided connection is not open, we will open it
            if (connection.State != ConnectionState.Open)
            {
                connection.Open();
            }

            //associate the connection with the command
            command.Connection = connection;

            //set the command text (stored procedure name or SQL statement)
            command.CommandText = commandText;

            //if we were provided a transaction, assign it.
            if (transaction != null)
            {
                command.Transaction = transaction;
            }

            //set the command type
            command.CommandType = commandType;

            //attach the command parameters if they are provided
            if (commandParameters != null)
            {
                AttachParameters(command, commandParameters);
            }
            return;
        }
        /// <summary>
        /// This method is used to attach array of SqlParameters to a SqlCommand.
        /// 
        /// This method will assign a value of DbNull to any parameter with a direction of
        /// InputOutput and a value of null.  
        /// 
        /// This behavior will prevent default values from being used, but
        /// this will be the less common case than an intended pure output parameter (derived as InputOutput)
        /// where the user provided no input value.
        /// </summary>
        /// <param name="command">The command to which the parameters will be added</param>
        /// <param name="commandParameters">an array of SqlParameters tho be added to command</param>
        private void AttachParameters(SqlCommand command, SqlParameter[] commandParameters)
        {
            foreach (SqlParameter p in commandParameters)
            {
                //check for derived output value with no value assigned
                if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
                {
                    p.Value = DBNull.Value;
                }

                command.Parameters.Add(p);
            }
        }

        /// <summary>
        /// 执行无参数的sql语句
        /// </summary>
        /// <param name="commandText"></param>
        /// <returns></returns>
        public void ExecuteSqls(List<string> commandText)
        {
            //using (SqlConnection conn = new SqlConnection(ConnStr))
            //{
            //    conn.Open();
            //    SqlCommand command = new SqlCommand(commandText);
            //    command.Connection = conn;
            //    return command.ExecuteNonQuery();
            //}
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                using (SqlTransaction trans = conn.BeginTransaction())
                {
                    SqlCommand cmd = new SqlCommand();
                    try
                    {
                        cmd.Connection = conn;
                        cmd.Transaction = trans;
                        //循环
                        foreach (string sql in commandText)
                        {
                            cmd.CommandText = sql;
                            cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();
                        }
                        trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        conn.Close();
                        throw ex;
                    }
                    finally
                    {
                        conn.Close();
                    }
                }

            }
        }
        /// <summary>
        /// 批量执行带参数的sql语句
        /// </summary>
        /// <param name="sqlList"></param>
        public void ExecuteSqlsParameter(List<KeyValuePair<object, object>> sqlList)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                using (SqlTransaction trans = conn.BeginTransaction())
                {
                    SqlCommand cmd = new SqlCommand();
                    try
                    {
                        cmd.Connection = conn;
                        cmd.Transaction = trans;
                        //循环
                        foreach (KeyValuePair<object, object> sql in sqlList)
                        {
                            cmd.CommandText = sql.Key.ToString();
                            foreach (SqlParameter item in (SqlParameter[])sql.Value)
                            {
                                cmd.Parameters.Add(item);
                            }
                            cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();
                        }
                        trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        conn.Close();
                        throw ex;
                    }
                    finally
                    {
                        conn.Close();
                    }
                }

            }
        }


        #region 设置SqlCommand对象
        /// <summary>
        /// 设置SqlCommand对象       
        /// </summary>
        /// <param name="cmd">SqlCommand对象 </param>
        /// <param name="cmdText">命令文本</param>
        /// <param name="cmdType">命令类型</param>
        /// <param name="cmdParms">参数集合</param>
        private static void SetCommand(SqlCommand cmd, string cmdText, CommandType cmdType,SqlConnection conn, SqlParameter[] cmdParms)
        {
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = cmdType;
            if (cmdParms != null)
            {
                cmd.Parameters.AddRange(cmdParms);
            }
        }
        #endregion

    }
}
原文地址:https://www.cnblogs.com/bijiang/p/5828060.html