zoukankan      html  css  js  c++  java
  • C# sqlhelper 2

    001    using System;
    002    using System.Data;
    003    using System.Configuration;
    004    using System.Web;
    005    using System.Web.Security;
    006    using System.Collections;
    007    using System.Data.SqlClient;
    008      
    009    /// <summary>
    010    /// 数据库的通用访问代码
    011    /// 此类为抽象类,不允许实例化,在应用时直接调用即可
    012    /// </summary>
    013    public abstract class SqlHelper
    014    {
    015        //获取数据库连接字符串,其属于静态变量且只读,项目中所有文档可以直接使用,但不能修改
    016        public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["pubsConnectionString"].ConnectionString;
    017      
    018        // 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。
    019        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
    020      
    021        /// <summary>
    022        ///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。
    023        /// 使用参数数组形式提供参数列表 
    024        /// </summary>
    025        /// <remarks>
    026        /// 使用示例:
    027        ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    028        /// </remarks>
    029        /// <param name="connectionString">一个有效的数据库连接字符串</param>
    030        /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    031        /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    032        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    033        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
    034        public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
    035        {
    036      
    037            SqlCommand cmd = new SqlCommand();
    038      
    039            using (SqlConnection conn = new SqlConnection(connectionString))
    040            {
    041                //通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中
    042                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
    043                int val = cmd.ExecuteNonQuery();
    044      
    045                //清空SqlCommand中的参数列表
    046                cmd.Parameters.Clear();
    047                return val;
    048            }
    049        }
    050          
    051        /// <summary>
    052        ///执行一条不返回结果的SqlCommand,通过一个已经存在的数据库连接 
    053        /// 使用参数数组提供参数
    054        /// </summary>
    055        /// <remarks>
    056        /// 使用示例:  
    057        ///  int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    058        /// </remarks>
    059        /// <param name="conn">一个现有的数据库连接</param>
    060        /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    061        /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    062        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    063        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
    064        public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
    065        {
    066      
    067            SqlCommand cmd = new SqlCommand();
    068      
    069            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
    070            int val = cmd.ExecuteNonQuery();
    071            cmd.Parameters.Clear();
    072            return val;
    073        }
    074      
    075        /// <summary>
    076        /// 执行一条不返回结果的SqlCommand,通过一个已经存在的数据库事物处理 
    077        /// 使用参数数组提供参数
    078        /// </summary>
    079        /// <remarks>
    080        /// 使用示例: 
    081        ///  int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    082        /// </remarks>
    083        /// <param name="trans">一个存在的 sql 事物处理</param>
    084        /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    085        /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    086        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    087        /// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>
    088        public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
    089        {
    090            SqlCommand cmd = new SqlCommand();
    091            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
    092            int val = cmd.ExecuteNonQuery();
    093            cmd.Parameters.Clear();
    094            return val;
    095        }
    096      
    097        /// <summary>
    098        /// 执行一条返回结果集的SqlCommand命令,通过专用的连接字符串。
    099        /// 使用参数数组提供参数
    100        /// </summary>
    101        /// <remarks>
    102        /// 使用示例:  
    103        ///  SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    104        /// </remarks>
    105        /// <param name="connectionString">一个有效的数据库连接字符串</param>
    106        /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    107        /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    108        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    109        /// <returns>返回一个包含结果的SqlDataReader</returns>
    110        public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
    111        {
    112            SqlCommand cmd = new SqlCommand();
    113            SqlConnection conn = new SqlConnection(connectionString);
    114      
    115            // 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在,
    116            //CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。
    117            //关闭数据库连接,并通过throw再次引发捕捉到的异常。
    118            try
    119            {
    120                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
    121                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    122                cmd.Parameters.Clear();
    123                return rdr;
    124            }
    125            catch
    126            {
    127                conn.Close();
    128                throw;
    129            }
    130        }
    131      
    132        /// <summary>
    133        /// 执行一条返回第一条记录第一列的SqlCommand命令,通过专用的连接字符串。 
    134        /// 使用参数数组提供参数
    135        /// </summary>
    136        /// <remarks>
    137        /// 使用示例:  
    138        ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    139        /// </remarks>
    140        /// <param name="connectionString">一个有效的数据库连接字符串</param>
    141        /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    142        /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    143        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    144        /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
    145        public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
    146        {
    147            SqlCommand cmd = new SqlCommand();
    148      
    149            using (SqlConnection connection = new SqlConnection(connectionString))
    150            {
    151                PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
    152                object val = cmd.ExecuteScalar();
    153                cmd.Parameters.Clear();
    154                return val;
    155            }
    156        }
    157      
    158        /// <summary>
    159        /// 执行一条返回第一条记录第一列的SqlCommand命令,通过已经存在的数据库连接。
    160        /// 使用参数数组提供参数
    161        /// </summary>
    162        /// <remarks>
    163        /// 使用示例: 
    164        ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
    165        /// </remarks>
    166        /// <param name="conn">一个已经存在的数据库连接</param>
    167        /// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    168        /// <param name="commandText">存储过程的名字或者 T-SQL 语句</param>
    169        /// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
    170        /// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
    171        public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
    172        {
    173      
    174            SqlCommand cmd = new SqlCommand();
    175      
    176            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
    177            object val = cmd.ExecuteScalar();
    178            cmd.Parameters.Clear();
    179            return val;
    180        }
    181      
    182        /// <summary>
    183        /// 缓存参数数组
    184        /// </summary>
    185        /// <param name="cacheKey">参数缓存的键值</param>
    186        /// <param name="cmdParms">被缓存的参数列表</param>
    187        public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters)
    188        {
    189            parmCache[cacheKey] = commandParameters;
    190        }
    191      
    192        /// <summary>
    193        /// 获取被缓存的参数
    194        /// </summary>
    195        /// <param name="cacheKey">用于查找参数的KEY值</param>
    196        /// <returns>返回缓存的参数数组</returns>
    197        public static SqlParameter[] GetCachedParameters(string cacheKey)
    198        {
    199            SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
    200      
    201            if (cachedParms == null)
    202                return null;
    203      
    204            //新建一个参数的克隆列表
    205            SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
    206      
    207            //通过循环为克隆参数列表赋值
    208            for (int i = 0, j = cachedParms.Length; i < j; i++)
    209                //使用clone方法复制参数列表中的参数
    210                clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
    211      
    212            return clonedParms;
    213        }
    214      
    215        /// <summary>
    216        /// 为执行命令准备参数
    217        /// </summary>
    218        /// <param name="cmd">SqlCommand 命令</param>
    219        /// <param name="conn">已经存在的数据库连接</param>
    220        /// <param name="trans">数据库事物处理</param>
    221        /// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param>
    222        /// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param>
    223        /// <param name="cmdParms">返回带参数的命令</param>
    224        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
    225        {
    226      
    227            //判断数据库连接状态
    228            if (conn.State != ConnectionState.Open)
    229                conn.Open();
    230      
    231            cmd.Connection = conn;
    232            cmd.CommandText = cmdText;
    233      
    234            //判断是否需要事物处理
    235            if (trans != null)
    236                cmd.Transaction = trans;
    237      
    238            cmd.CommandType = cmdType;
    239      
    240            if (cmdParms != null)
    241            {
    242                foreach (SqlParameter parm in cmdParms)
    243                    cmd.Parameters.Add(parm);
    244            }
    245        }
    246    }
  • 相关阅读:
    jquery实现选项卡(两句即可实现)
    常用特效积累
    jquery学习笔记
    idong常用js总结
    织梦添加幻灯片的方法
    LeetCode "Copy List with Random Pointer"
    LeetCode "Remove Nth Node From End of List"
    LeetCode "Sqrt(x)"
    LeetCode "Construct Binary Tree from Inorder and Postorder Traversal"
    LeetCode "Construct Binary Tree from Preorder and Inorder Traversal"
  • 原文地址:https://www.cnblogs.com/allen0/p/9490388.html
Copyright © 2011-2022 走看看