使用ADO.NET操作SqlServer,开启一个事务


1、创建SqlConnection对象(connStr是链接字符串)

SqlConnection conn = new SqlConnection(connStr);

2、创建SqlTransaction对象(执行事务)

因为SqlTransaction对象继承了DbTransaction对象

而DbTransaction的构造函数使用了Protected关键字保护,只能被基类和子类实例化

所以,如果我们要想创建一个SqlTransaction对象,就要从其他方面入手,比如SqlConnection对象

使用SqlConnection对象的BeginTransaction()函数创建一个SqlTransaction对象

SqlTransaction tran = conn.BeginTransaction();

3、创建SqlCommand对象,不过创建之前我们可以先看一下SqlCommand的构造函数

 3.1

可以发现,后两个构造函数都可以传入SqlTransaction对象,我们只需要用第三个构造函数来创建SqlConmmand就行

SqlCommand cmd = new SqlCommand(sql,conn,tran);

3.2

如果有很多sql语句要执行,比如一个sql语句数组,则创建一个空的SqlCommand对象(不推荐,因为需要和数据库进行很多次交互,浪费性能)

SqlCommand cmd = new SqlCommand();

手动绑定SqlTransaction对象和SqlConnection对象

//绑定Command对象的Connection对象
cmd.Connection = conn;
//绑定Command对象的Transaction对象
cmd.Transaction = tran; 

通过循环来绑定和执行Sql语句(设置SqlCommand的CommandText属性)

//通过循环执行事务
int i; for (i = 0; i < sqls.Length; i++) { //设置要执行的语句 cmd.CommandText = sqls[i]; //添加参数 if (parm != null && parm[i] != null && parm[i].Length > 0) cmd.Parameters.AddRange(parm[i]); //执行 if (cmd.ExecuteNonQuery()<=0) { //回滚 tran.Rollback(); //结束 break; }; }

全部正确的话则提交事务

if(i==sqls.Length) tran.Commit();

4、完整代码

/// <summary>
/// 执行一个事务
/// </summary>
/// <param name="sqls">Sql语句数组</param>
/// <param name="parm">参数数组(必须和sqls数组长度一致、如果为空也要传递过来)</param>
/// <returns>返回成功或失败</returns>
public static Boolean ExecuteTransaction(String[] sqls,params SqlParameter[][] parm) {
    //创建链接对象
    using (SqlConnection conn  = new SqlConnection(connStr)) {
        //打开链接
        conn.Open();
        //创建执行命令对象
        SqlCommand cmd = new SqlCommand();
        //创建一个事务
        //通过conn对象获取一个事务对象
        SqlTransaction tran = conn.BeginTransaction();

        SqlCommand cmd1 = new SqlCommand(sqls[0],conn,tran);

        try
        {
            //绑定Command对象的Connection对象
            cmd.Connection = conn;
            //绑定Command对象的Transaction对象
            cmd.Transaction = tran;

            //通过循环执行事务
            for (int i = 0; i < sqls.Length; i++)
            {
                //设置要执行的语句
                cmd.CommandText = sqls[i];
                //添加参数
                if (parm != null && parm[i] != null && parm[i].Length > 0) cmd.Parameters.AddRange(parm[i]);
                //执行
                if (cmd.ExecuteNonQuery()<=0) {
                    //回滚
                    tran.Rollback();
                    //结束
                    return false;
                };
            }
            //提交事务
            tran.Commit();
            return true;
        }
        catch (Exception e)
        {
            tran.Rollback();
            return false;
        }

    }
}

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM