zoukankan      html  css  js  c++  java
  • Sql Server 数据库帮助类

    using System;
    using System.Text;
    using System.Data;
    using System.Data.Common;
    
    namespace Data.Core
    {
        /// <summary>
        /// 关系数据库帮助类
        /// </summary>
        public partial class RDBSHelper
        {
            private static object _locker = new object();//锁对象
    
            private static DbProviderFactory _factory;//抽象数据工厂
    
            private static string _rdbstablepre;//关系数据库对象前缀
            private static string _connectionstring;//关系数据库连接字符串
    
            [ThreadStatic]
            private static TransConnection TransConnectionObject = null;
    
            /// <summary>
            /// 关系数据库对象前缀
            /// </summary>
            public static string RDBSTablePre
            {
                get { return _rdbstablepre; }
            }
    
            /// <summary>
            /// 关系数据库连接字符串
            /// </summary>
            public static string ConnectionString
            {
                get { return _connectionstring; }
            }
    
    #if DEBUG
            private static int _executecount = 0;
            private static string _executedetail = string.Empty;
    
            /// <summary>
            /// 数据库执行次数
            /// </summary>
            public static int ExecuteCount
            {
                get { return _executecount; }
                set { _executecount = value; }
            }
    
            /// <summary>
            /// 数据库执行细节
            /// </summary>
            public static string ExecuteDetail
            {
                get { return _executedetail; }
                set { _executedetail = value; }
            }
    
            /// <summary>
            /// 设置数据库执行细节
            /// </summary>
            /// <param name="commandText">数据库执行语句</param>
            /// <param name="startTime">数据库执行开始时间</param>
            /// <param name="endTime">数据库执行结束时间</param>
            /// <param name="commandParameters">数据库执行参数列表</param>
            /// <returns></returns>
            private static string GetExecuteDetail(string commandText, DateTime startTime, DateTime endTime, DbParameter[] commandParameters)
            {
                if (commandParameters != null && commandParameters.Length > 0)
                {
                    StringBuilder paramdetails = new StringBuilder("<div style=\"display:block;clear:both;margin-left:auto;margin-right:auto;100%;\"><table cellspacing=\"0\" cellpadding=\"0\" style=\"border: 1px solid black;background:rgb(255, 255, 255) none repeat scroll 0%;font-size:12px;display:block;margin-left:auto;margin-right:auto;margin-top:5px;margin-bottom:5px;960px;\">");
                    paramdetails.AppendFormat("<tr><td colspan=\"3\">执行SQL:{0}</td></tr>", commandText);
                    paramdetails.AppendFormat("<tr><td colspan=\"3\">执行时间:{0}</td></tr>", endTime.Subtract(startTime).TotalMilliseconds / 1000);
                    foreach (DbParameter param in commandParameters)
                    {
                        if (param == null)
                            continue;
    
                        paramdetails.Append("<tr>");
                        paramdetails.AppendFormat("<td width=\"250px\">参数名称:{0}</td>", param.ParameterName);
                        paramdetails.AppendFormat("<td width=\"250px\">参数类型:{0}</td>", param.DbType);
                        paramdetails.AppendFormat("<td>参数值:{0}</td>", param.Value);
                        paramdetails.Append("</tr>");
                    }
                    return paramdetails.Append("</table></div>").ToString();
                }
                return string.Empty;
            }
    #endif
    
            static RDBSHelper()
            {
                //设置数据工厂
                _factory = XuData.RDBS.GetDbProviderFactory();
                //设置关系数据库对象前缀
                _rdbstablepre = XuConfig.RDBSConfig.RDBSTablePre;
                //设置关系数据库连接字符串
                _connectionstring = XuConfig.RDBSConfig.RDBSConnectString;
            }
    
            #region Db Transaction
    
            public static void BeginTransaction()
            {
                if (TransConnectionObject == null)
                {
                    DbConnection conn = _factory.CreateConnection();
                    conn.ConnectionString = ConnectionString;
                    OpenConnection(conn);
                    DbTransaction trans = conn.BeginTransaction();
                    TransConnectionObject = new TransConnection();
                    TransConnectionObject.DBTransaction = trans;
                }
                else
                {
                    TransConnectionObject.Deeps += 1;
                }
            }
    
            public static void CommitTransaction()
            {
                if (TransConnectionObject == null) return;
    
                if (TransConnectionObject.Deeps > 0)
                {
                    TransConnectionObject.Deeps -= 1;
                }
                else
                {
                    TransConnectionObject.DBTransaction.Commit();
                    ReleaseTransaction();
                }
            }
    
            public static void RollbackTransaction()
            {
                if (TransConnectionObject == null) return;
    
                if (TransConnectionObject.Deeps > 0)
                {
                    TransConnectionObject.Deeps -= 1;
                }
                else
                {
                    TransConnectionObject.DBTransaction.Rollback();
                    ReleaseTransaction();
                }
            }
    
            private static void ReleaseTransaction()
            {
                if (TransConnectionObject == null) return;
    
                DbConnection conn = TransConnectionObject.DBTransaction.Connection;
                TransConnectionObject.DBTransaction.Dispose();
                TransConnectionObject = null;
                CloseConnection(conn);
            }
    
            private static void OpenConnection(DbConnection conn)
            {
                if (conn == null)
                {
                    conn = _factory.CreateConnection();
                    conn.ConnectionString = ConnectionString;
                }
    
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }
            }
            private static void CloseConnection(DbConnection conn)
            {
                if (conn == null) return;
    
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
                conn.Dispose();
                conn = null;
            }
    
            #endregion
    
            #region ExecuteNonQuery
    
            public static int ExecuteNonQuery(string cmdText)
            {
                return ExecuteNonQuery(CommandType.Text, cmdText, null);
            }
    
            public static int ExecuteNonQuery(CommandType cmdType, string cmdText)
            {
                return ExecuteNonQuery(cmdType, cmdText, null);
            }
    
            public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
            {
    #if DEBUG
                _executecount++;
    #endif
                DbCommand cmd = _factory.CreateCommand();
    
                using (DbConnection conn = _factory.CreateConnection())
                {
                    conn.ConnectionString = ConnectionString;
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
    #if DEBUG
                    DateTime startTime = DateTime.Now;
    #endif
                    int val = cmd.ExecuteNonQuery();
    #if DEBUG
                    DateTime endTime = DateTime.Now;
                    _executedetail += GetExecuteDetail(cmd.CommandText, startTime, endTime, commandParameters);
    #endif
                    cmd.Parameters.Clear();
                    return val;
                }
            }
    
    
    
            public static int ExecuteNonQuery(DbTransaction trans, CommandType cmdType, string cmdText)
            {
                return ExecuteNonQuery(trans, cmdType, cmdText, null);
            }
    
            public static int ExecuteNonQuery(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
            {
    #if DEBUG
                _executecount++;
    #endif
    
                DbCommand cmd = _factory.CreateCommand();
                PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
    #if DEBUG
                DateTime startTime = DateTime.Now;
    #endif
                int val = cmd.ExecuteNonQuery();
    #if DEBUG
                DateTime endTime = DateTime.Now;
                _executedetail += GetExecuteDetail(cmd.CommandText, startTime, endTime, commandParameters);
    #endif
                cmd.Parameters.Clear();
                return val;
            }
    
            #endregion
    
            #region ExecuteNoQueryTrans
    
            public static int ExecuteNonQueryTrans(string cmdText)
            {
                return ExecuteNonQueryTrans(CommandType.Text, cmdText, null);
            }
    
            public static int ExecuteNonQueryTrans(CommandType cmdType, string cmdText)
            {
                return ExecuteNonQueryTrans(cmdType, cmdText, null);
            }
    
            public static int ExecuteNonQueryTrans(string cmdText, params DbParameter[] commandParameters)
            {
                return ExecuteNonQueryTrans(CommandType.Text, cmdText, commandParameters);
            }
    
            public static int ExecuteNonQueryTrans(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
            {
                int val = 0;
    
                DbCommand cmd = _factory.CreateCommand();
                using (DbConnection conn = _factory.CreateConnection())
                {
                    conn.ConnectionString = ConnectionString;
                    conn.Open();
                    DbTransaction trans = conn.BeginTransaction();
                    PrepareCommand(cmd, conn, trans, cmdType, cmdText, commandParameters);
    
                    try
                    {
                        val = cmd.ExecuteNonQuery();
    
                        cmd.Parameters.Clear();
    
                        trans.Commit();
                    }
                    catch (DbException)
                    {
                        trans.Rollback();
                    }
                    finally
                    {
                        trans.Dispose();
                    }
                }
    
                return val;
            }
    
            #endregion
    
            #region ExecuteReader
    
            public static DbDataReader ExecuteReader(CommandType cmdType, string cmdText)
            {
                return ExecuteReader(cmdType, cmdText, null);
            }
    
            public static DbDataReader ExecuteReader(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
            {
    #if DEBUG
                _executecount++;
    #endif
    
                DbCommand cmd = _factory.CreateCommand();
                DbConnection conn = _factory.CreateConnection();
                conn.ConnectionString = ConnectionString;
                DbDataReader rdr = null;
                try
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
    #if DEBUG
                    DateTime startTime = DateTime.Now;
    #endif
                    rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    #if DEBUG
                    DateTime endTime = DateTime.Now;
                    _executedetail += GetExecuteDetail(cmd.CommandText, startTime, endTime, commandParameters);
    #endif
                    cmd.Parameters.Clear();
                    return rdr;
                }
                catch
                {
                    if(rdr!=null && !rdr.IsClosed)
                    {
                        rdr.Close();
                    }           
                    conn.Close();
                    throw;
                }
            }
    
            public static DbDataReader ExecuteReader(DbTransaction trans, CommandType cmdType, string cmdText)
            {
                return ExecuteReader(trans, cmdType, cmdText, null);
            }
    
            public static DbDataReader ExecuteReader(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
            {
    #if DEBUG
                _executecount++;
    #endif
    
                DbCommand cmd = _factory.CreateCommand();
    
                PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
    #if DEBUG
                DateTime startTime = DateTime.Now;
    #endif
                DbDataReader rdr = cmd.ExecuteReader();
    #if DEBUG
                DateTime endTime = DateTime.Now;
                _executedetail += GetExecuteDetail(cmd.CommandText, startTime, endTime, commandParameters);
    #endif
                cmd.Parameters.Clear();
                return rdr;
    
            }
    
            #endregion
    
            #region ExecuteScalar
    
            public static object ExecuteScalar(CommandType cmdType, string cmdText)
            {
                return ExecuteScalar(cmdType, cmdText, null);
            }
    
            public static object ExecuteScalar(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
            {
    #if DEBUG
                _executecount++;
    #endif
    
                DbCommand cmd = _factory.CreateCommand();
    
                using (DbConnection connection = _factory.CreateConnection())
                {
                    connection.ConnectionString = ConnectionString;
                    PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
    #if DEBUG
                    DateTime startTime = DateTime.Now;
    #endif
                    object val = cmd.ExecuteScalar();
    #if DEBUG
                    DateTime endTime = DateTime.Now;
                    _executedetail += GetExecuteDetail(cmd.CommandText, startTime, endTime, commandParameters);
    #endif
                    cmd.Parameters.Clear();
                    return val;
                }
            }
    
    
    
            public static object ExecuteScalar(DbTransaction trans, CommandType cmdType, string cmdText)
            {
                return ExecuteScalar(trans, cmdType, cmdText, null);
            }
    
            public static object ExecuteScalar(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
            {
    #if DEBUG
                _executecount++;
    #endif
    
                DbCommand cmd = _factory.CreateCommand();
                PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
    #if DEBUG
                DateTime startTime = DateTime.Now;
    #endif
                object val = cmd.ExecuteScalar();
    #if DEBUG
                DateTime endTime = DateTime.Now;
                _executedetail += GetExecuteDetail(cmd.CommandText, startTime, endTime, commandParameters);
    #endif
                cmd.Parameters.Clear();
                return val;
            }
    
            #endregion
    
            #region ExecuteDataset
    
            public static DataSet ExecuteDataset(CommandType cmdType, string cmdText)
            {
                return ExecuteDataset(cmdType, cmdText, null);
            }
    
            public static DataSet ExecuteDataset(CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
            {
    #if DEBUG
                _executecount++;
    #endif
    
                DbCommand cmd = _factory.CreateCommand();
                DbConnection conn = _factory.CreateConnection();
                conn.ConnectionString = ConnectionString;
                DbDataAdapter adapter = _factory.CreateDataAdapter();
    
                try
                {
                    PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                    adapter.SelectCommand = cmd;
                    DataSet ds = new DataSet();
    
    #if DEBUG
                    DateTime startTime = DateTime.Now;
    #endif
                    adapter.Fill(ds);
    #if DEBUG
                    DateTime endTime = DateTime.Now;
                    _executedetail += GetExecuteDetail(cmd.CommandText, startTime, endTime, commandParameters);
    #endif
                    cmd.Parameters.Clear();
                    return ds;
                }
                catch
                {
                    throw;
                }
                finally
                {
                    adapter.Dispose();
                    conn.Close();
                }
            }
    
    
    
            public static DataSet ExecuteDataset(DbTransaction trans, CommandType cmdType, string cmdText)
            {
                return ExecuteDataset(trans, cmdType, cmdText, null);
            }
    
            public static DataSet ExecuteDataset(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] commandParameters)
            {
    #if DEBUG
                _executecount++;
    #endif
    
                DbCommand cmd = _factory.CreateCommand();
                DbDataAdapter adapter = _factory.CreateDataAdapter();
    
                PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
                adapter.SelectCommand = cmd;
                DataSet ds = new DataSet();
    
    #if DEBUG
                DateTime startTime = DateTime.Now;
    #endif
                adapter.Fill(ds);
    #if DEBUG
                DateTime endTime = DateTime.Now;
                _executedetail += GetExecuteDetail(cmd.CommandText, startTime, endTime, commandParameters);
    #endif
                cmd.Parameters.Clear();
                return ds;
            }
    
            #endregion
    
            private static void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, CommandType cmdType, string cmdText, DbParameter[] cmdParms)
            {
                
                cmd.CommandText = cmdText;
    
                if (trans != null)
                {
                    if (conn.State != ConnectionState.Open)
                        conn.Open();
                    cmd.Connection = conn;
                    cmd.Transaction = trans;
                }
                else
                {
                    if (TransConnectionObject != null)
                    {
                        cmd.Connection = TransConnectionObject.DBTransaction.Connection;
                        OpenConnection(cmd.Connection);
                        cmd.Transaction = TransConnectionObject.DBTransaction;
                    }
                    else
                    {
                        if (conn.State != ConnectionState.Open)
                            conn.Open();
                        cmd.Connection = conn;
                    }
                }
    
                cmd.CommandType = cmdType;
    
                if (cmdParms != null)
                {
                    foreach (DbParameter parm in cmdParms)
                    {
                        if (parm != null)
                        {
                            if ((parm.Direction == ParameterDirection.InputOutput || parm.Direction == ParameterDirection.Input) &&
                                (parm.Value == null))
                            {
                                parm.Value = DBNull.Value;
                            }
                            cmd.Parameters.Add(parm);
                        }
                    }
                }
            }
    
        }
    
        // 事务处理类
        internal class TransConnection
        {
            public TransConnection()
            {
                this.Deeps = 0;
            }
    
            public DbTransaction DBTransaction { get; set; }
    
            public int Deeps { get; set; }
        }
    
    }
    

      

  • 相关阅读:
    .NET 4.5 is an in-place replacement for .NET 4.0
    python Argparse模块的使用
    linux的fork(), vfork()区别
    Linux 的 strace 命令
    NTFS系统的ADS交换数据流
    Git和.gitignore
    GIT常用命令
    OSChina码云试用
    tcpdump用法
    linux网卡混杂模式
  • 原文地址:https://www.cnblogs.com/shiding/p/14364467.html
Copyright © 2011-2022 走看看