自用sqlhelper

工作中偶尔会用到ado.net,但一直没有自己的sqlhelper,网上的感觉有些乱。今天抽时间自己整理了一份,功能简洁,但能满足大部分情况下使用,支持sql,存储过程,事务。

public static class SqlHelper
    {
        private static readonly string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;

        #region 使用示例
        //string sql = "update [User] set Name=@name where Id=@id";
        //SqlParameter[] pms = new SqlParameter[]{
        //        new SqlParameter("name",SqlDbType.NVarChar,20){Value="xc"},
        //        new SqlParameter("id",SqlDbType.Int){Value=1}
        //    };
        //int n = SqlHelper.ExecuteNonQuery(sql, CommandType.Text, pms);
        #endregion

        /// <summary>
        /// 执行返回受影响行数的sql或者存储过程
        /// </summary>
        /// <param name="cmdText">sql,存储过程名</param>
        /// <param name="cmdType">CommandType.Text,CommandType.StoredProcedure</param>
        /// <param name="pms">sql或procedure的参数,没有该参数则传null</param>
        /// <returns>返回受影响行数</returns>
        public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = new SqlCommand(cmdText, con))
                {
                    cmd.CommandType = cmdType;
                    if (pms != null)
                    {
                        cmd.Parameters.AddRange(pms);
                    }
                    con.Open();
                    return cmd.ExecuteNonQuery();
                }
            }
        }

        /// <summary>
        /// 执行返回单个值的sql或者存储过程
        /// </summary>
        /// <param name="cmdText">sql或procedure</param>
        /// <param name="cmdType">CommandType.Text,CommandType.StoredProcedure</param>
        /// <param name="pms">sql或procedure的参数,没有该参数则传null</param>
        /// <returns>返回单个值</returns>
        public static object ExecuteScalar(string cmdText, CommandType cmdType, params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = new SqlCommand(cmdText, con))
                {
                    cmd.CommandType = cmdType;
                    if (pms != null)
                    {
                        cmd.Parameters.AddRange(pms);
                    }
                    con.Open();
                    return cmd.ExecuteScalar();
                }
            }
        }

        /// <summary>
        /// 执行返回DataReader的sql或者存储过程
        /// 读取完毕需要手动关闭SqlDataReader
        /// </summary>
        /// <param name="cmdText">sql或procedure</param>
        /// <param name="cmdType">CommandType.Text,CommandType.StoredProcedure</param>
        /// <param name="pms">sql或procedure的参数,没有该参数则传null</param>
        /// <returns>返回DataReader</returns>
        public static SqlDataReader ExecuteReader(string cmdText, CommandType cmdType, params SqlParameter[] pms)
        {
            SqlConnection con = new SqlConnection(conStr);
            using (SqlCommand cmd = new SqlCommand(cmdText, con))
            {
                cmd.CommandType = cmdType;
                if (pms != null) cmd.Parameters.AddRange(pms);
                try
                {
                    if (con.State == ConnectionState.Closed)
                    {
                        con.Open();
                    }
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (SqlException ex)
                {
                    con.Close();
                    con.Dispose();
                    throw ex;
                }
            }
        }

        /// <summary>
        /// 执行返回DataTable的sql或者存储过程
        /// </summary>
        /// <param name="cmdText">sql或procedure</param>
        /// <param name="cmdType">CommandType.Text,CommandType.StoredProcedure</param>
        /// <param name="pms">sql或procedure的参数,没有该参数则传null</param>
        /// <returns>返回DataTable</returns>
        public static DataTable ExecuteDataTable(string cmdText, CommandType cmdType, params SqlParameter[] pms)
        {
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(cmdText, conStr))
            {
                adapter.SelectCommand.CommandType = cmdType;
                if (pms != null)
                {
                    adapter.SelectCommand.Parameters.AddRange(pms);
                }
                adapter.Fill(dt);
            }
            return dt;
        }

        /// <summary>
        /// 在事务中执行返回受影响行数的多条sql语句
        /// </summary>
        /// <param name="list">KeyValuePair<string, SqlParameter[]>集合,Key=sql,Value=params</param>
        /// <param name="cmdType">CommandType.Text,CommandType.StoredProcedure</param>
        /// <returns>返回受影响行数</returns>
        public static int ExecuteNonQueryTransaction(List<KeyValuePair<string, SqlParameter[]>> list, CommandType cmdType)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                con.Open();
                SqlTransaction tx = con.BeginTransaction();
                SqlCommand cmd = new SqlCommand();
                try
                {
                    int count = 0;
                    cmd.Connection = con;
                    cmd.Transaction = tx;
                    cmd.CommandType = cmdType;
                    foreach (var item in list)
                    {
                        string sql = item.Key;
                        if (!string.IsNullOrEmpty(sql)) cmd.CommandText = sql;
                        SqlParameter[] pms = item.Value;
                        if (pms != null) cmd.Parameters.AddRange(pms);
                        count += cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                    }
                    tx.Commit();
                    return count;
                }
                catch (SqlException ex)
                {
                    tx.Rollback();
                    throw ex;
                }
                finally
                {
                    tx.Dispose();
                    cmd.Dispose();
                }
            }
        }
    }


猜你喜欢

转载自blog.csdn.net/mkcrawling/article/details/77512524