• C# 事务处理


    前言:

          通常SqlHelper类为了方便处理,做成了静态类,静态类的问题是不方便添加事务处理。

          实例化类方便添加事务处理,DoTrans/CommitTrans/RollBackTrans  三个函数

    说明:

    1:ExecuteNonQuery执行多条SQL语句,默认包含事务。

    实际执行代码:

    SqlServerInfo ssi = new SqlServerInfo();
                string strSql="UPDATE dbo.Test SET testname='2321' WHERE testid=1;UPDATE dbo.TestCustorm SET TestNickName='Nick2321' WHERE testid=1;";
                //string strsql1 = "UPDATE dbo.TestCustorm SET TestNickName='Nick2321' WHERE testid=1;";
                //string strsql2 = "UPDATE dbo.Test SET testname='2321' WHERE testid=1";
                int i=ssi.ExecuteNonQuerySqlTextWithNoTrans(strSql);
                if(i>0)
                {
                    Response.Write("执行成功");
                }
                else
                {
                    Response.Write("执行失败");
                }

    SQL执行代码:

    public class SqlServerInfo
        {
            private string _SqlConnectionString = "Data Source=(local);Initial Catalog=test;User ID=sa;Password=sasa;";
            public string SqlConnectionString
            {
                get
                {
                    return _SqlConnectionString;
                }
                set
                {
                    _SqlConnectionString = value;
                }
            }
    
            /// <summary>
            /// 执行sql语句并返回受影响行数
            /// </summary>
            /// <param name="cmdText">sql语句</param>
            /// <returns></returns>
            public int ExecuteNonQuerySqlTextWithTrans(string cmdText)
            {
                int num2=0;
                SqlConnection connection = new SqlConnection(_SqlConnectionString);
                connection.Open();
                SqlCommand cmd = new SqlCommand();
                SqlTransaction sTran = connection.BeginTransaction();
                try
                {
                    PrepareCommand(cmd, connection, sTran, CommandType.Text, cmdText, null);
                    num2 = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                    sTran.Commit();
                    connection.Close();
    
                }
                catch (Exception ex)
                {
                    //LogHelper log = new LogHelper();
                    //log.WriteLog("时间:" + DateTime.Now.ToString() + "----错误消息:" + ex.Message);
                    sTran.Rollback();
                }
                return num2;
            }
    
            /// <summary>
            /// 执行sql语句并返回受影响行数
            /// </summary>
            /// <param name="cmdText">sql语句</param>
            /// <returns></returns>
            public int ExecuteNonQuerySqlTextWithNoTrans(string cmdText)
            {
                int num2 = 0;
                SqlConnection connection = new SqlConnection(_SqlConnectionString);
                connection.Open();
                SqlCommand cmd = new SqlCommand();
                try
                {
                    PrepareCommand(cmd, connection, null, CommandType.Text, cmdText, null);
                    num2 = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                    connection.Close();
    
                }
                catch (Exception ex)
                {
    
                }
                return num2;
            }
    
    
            /// <summary>
            /// Command准备
            /// </summary>
            /// <param name="cmd"></param>
            /// <param name="conn"></param>
            /// <param name="isOpenTrans"></param>
            /// <param name="cmdType"></param>
            /// <param name="cmdText"></param>
            /// <param name="cmdParms"></param>
            private void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction isOpenTrans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                if (isOpenTrans != null)
                {
                    cmd.Transaction = isOpenTrans;
                }
                cmd.CommandType = cmdType;
                if (cmdParms != null)
                {
                    cmd.Parameters.AddRange(cmdParms);
                }
            }
        }

    2:分割执行包含事务

    执行语句:

    protected void Button1_Click(object sender, EventArgs e)
            {
                SqlServerInfo ssi = new SqlServerInfo();
                int iSeed = 3;
                Random ran = new Random(iSeed);
                int RandKey=ran.Next(100,999);
                string strSql = "UPDATE dbo.Test SET testname='" + RandKey.ToString() + "' WHERE testid=1;UPDATE dbo.TestCustorm SET TestNickName1='Nick" + RandKey.ToString() + "' WHERE testid=1";
                //string strsql1 = "UPDATE dbo.TestCustorm SET TestNickName='Nick2321' WHERE testid=1;";
                //string strsql2 = "UPDATE dbo.Test SET testname='2321' WHERE testid=1";
                int i=ssi.ExecuteNonQuerySqlTextWithNoTrans(strSql);
                if(i>0)
                {
                    Response.Write("执行成功");
                }
                else
                {
                    Response.Write("执行失败");
                }
    
            }
    
            protected void Button2_Click(object sender, EventArgs e)
            {
                SqlServerInfo ssi = new SqlServerInfo();
                int iSeed = 4;
                Random ran = new Random(iSeed);
                int RandKey = ran.Next(1000, 9999);
                string strSql = "UPDATE dbo.Test SET testname='" + RandKey.ToString() + "' WHERE testid=1;UPDATE dbo.TestCustorm SET TestNickName1='Nick" + RandKey.ToString() + "' WHERE testid=1";
                //string strsql1 = "UPDATE dbo.TestCustorm SET TestNickName='Nick2321' WHERE testid=1;";
                //string strsql2 = "UPDATE dbo.Test SET testname='2321' WHERE testid=1";
                int i = ssi.ExecuteNonQuerySqlTextWithTrans(strSql);
                if (i > 0)
                {
                    Response.Write("执行成功");
                }
                else
                {
                    Response.Write("执行失败");
                }
    
            }

    处理代码:

    public class SqlServerInfo
        {
            private string _SqlConnectionString = "Data Source=(local);Initial Catalog=test;User ID=sa;Password=sasa;";
            public string SqlConnectionString
            {
                get
                {
                    return _SqlConnectionString;
                }
                set
                {
                    _SqlConnectionString = value;
                }
            }
    
            /// <summary>
            /// 执行sql语句并返回受影响行数
            /// </summary>
            /// <param name="cmdText">sql语句</param>
            /// <returns></returns>
            public int ExecuteNonQuerySqlTextWithTrans(string cmdText)
            {
                int num2=0;
                SqlConnection connection = new SqlConnection(_SqlConnectionString);
                connection.Open();
                SqlCommand cmd = new SqlCommand();
                SqlTransaction sTran = connection.BeginTransaction();
                try
                {
                    string[] sqlContexts= cmdText.Split(';');
                    foreach(string sql in sqlContexts)
                    {
                        PrepareCommand(cmd, connection, sTran, CommandType.Text, cmdText, null);
                        num2 = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                    }
                    sTran.Commit();
                    connection.Close();
    
                }
                catch (Exception ex)
                {
                    //LogHelper log = new LogHelper();
                    //log.WriteLog("时间:" + DateTime.Now.ToString() + "----错误消息:" + ex.Message);
                    sTran.Rollback();
                }
                return num2;
            }
    
            /// <summary>
            /// 执行sql语句并返回受影响行数
            /// </summary>
            /// <param name="cmdText">sql语句</param>
            /// <returns></returns>
            public int ExecuteNonQuerySqlTextWithNoTrans(string cmdText)
            {
                int num2 = 0;
                SqlConnection connection = new SqlConnection(_SqlConnectionString);
                connection.Open();
                SqlCommand cmd = new SqlCommand();
                try
                {
                    string[] sqlContexts= cmdText.Split(';');
                    foreach(string sql in sqlContexts)
                    {
                        PrepareCommand(cmd, connection, null, CommandType.Text, sql, null);
                        num2 = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                    }
                    
                    connection.Close();
    
                }
                catch (Exception ex)
                {
    
                }
                return num2;
            }
    
    
            /// <summary>
            /// Command准备
            /// </summary>
            /// <param name="cmd"></param>
            /// <param name="conn"></param>
            /// <param name="isOpenTrans"></param>
            /// <param name="cmdType"></param>
            /// <param name="cmdText"></param>
            /// <param name="cmdParms"></param>
            private void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction isOpenTrans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms)
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                if (isOpenTrans != null)
                {
                    cmd.Transaction = isOpenTrans;
                }
                cmd.CommandType = cmdType;
                if (cmdParms != null)
                {
                    cmd.Parameters.AddRange(cmdParms);
                }
            }
        }
  • 相关阅读:
    每日总结
    每日总结
    《构建之法》读后感3
    每日博客
    每日博客
    每日博客
    每日博客
    预开发软件书
    每日博客
    每日博客
  • 原文地址:https://www.cnblogs.com/volts0302/p/5168538.html
Copyright © 2020-2023  润新知