SqlCommand 带参数,带事务。

【理论基础】

在2.0以前版本的 ADO.NET 中,使用 DataSet 中的更改来更新数据库时,DataAdapter 的 Update 方法每次更新数据库的一行。因为该方法循环访问指定 DataTable 中的行,所以,会检查每个 DataRow,确定是否已修改。如果该行已修改,将根据该行的 RowState 属性值调用相应的UpdateCommand、InsertCommand 或 DeleteCommand。每一次行更新都涉及网络与数据库之间的双向数据传输。

  ——注意这段话的意思是根据DataSet中每一行的RowState值,采取相应的数据操作:由DataAdapter 调用相应的命令执行。在ADO.NET 2.0版本中也是这样执行的。

  在 ADO.NET 2.0 中,DataAdapter 公开了 UpdateBatchSize 属性。将 UpdateBatchSize 设置为正整数值将使对数据库的更新以指定大小的批次进行发送。例如,如果将 UpdateBatchSize 设置为 10,会将 10 个独立的语句组合在一起并作为一批提交。将 UpdateBatchSize 设置为 0 将导致 DataAdapter 使用服务器可以处理的最大批次的大小。如果将其设置为 1,则禁用批量更新,因为此时每次发送一行。

  ——UpdateBatchSize 属性是实现批量修改数据的关键。

————————————————
版权声明:本文为CSDN博主「wxlkeepmoving」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wxlkeepmoving/article/details/5093586

//打开两个连接:两个事务,当两个操作都没有问题的时候,两个事务才进行提交,否则回滚。
static void TestReturnDataSetThenUpdateDBWithTransaltionByTwoConn()
{

        DataSet ds = TestReturnDB();
        ////////////////////////////////////////////
        //封装成EnClosure
        List<Shippers> Newshippers = EnClosure(ds);

        String connectionSql1 = "Data Source=127.0.0.1;Initial Catalog=TSQLTemp;User ID=sa;Password=sa123456";
        String connectionSql2 = "Data Source=127.0.0.1;Initial Catalog=TSQLFundamentals2008;User ID=sa;Password=sa123456";

        /////////////////////////////////////////// 
        SqlTransaction tran =null;
        SqlTransaction strant2 = null;
        SqlConnection conn;
        SqlConnection conn2;
        try
        {
            conn  = new SqlConnection(connectionSql1);
            conn.Open();

            tran =  conn.BeginTransaction();  //开启事务
            string sqlStr = "Select top 1 * from dbo.Shippers";
             
           
            SqlDataAdapter adapter=new SqlDataAdapter();
            SqlCommand cmd=new SqlCommand(sqlStr,conn,tran);
            adapter.SelectCommand=cmd; 

            SqlCommandBuilder thisBuilder = new SqlCommandBuilder(adapter);  //一定要添加。。。  自动更改
                    
            adapter.Fill(ds, "newShippers");    //封装到ds 新的仓库中

            foreach (Shippers item in Newshippers)
            {
                DataRow dr = ds.Tables["newShippers"].NewRow();
                dr["companyname"] = item.Companyname;
                dr["phone"] = item.Phone;
                ds.Tables["newShippers"].Rows.Add(dr);

            }
            //new SqlCommand(Update,connection).Parameters.Add('@参数名','类型','长度','数据库表列名')
            //插入到新表中
            adapter.Update(ds.Tables["newShippers"]); //更新回数据库。。。。。

        //更新源表的状态
        DataRowCollection drc = ds.Tables["Shippers"].Rows;
        int count = drc.Count;
        for (int i = 0; i < count; i++)
        {
            drc[i]["companyname"] = "UpdateStatuskkkkkkkkkkkk";
        } 
            conn2 = new SqlConnection(connectionSql2);
            conn2.Open();
            strant2 = conn2.BeginTransaction();
             
            string sqlStr2 = "Select top  1  * from Sales.Shippers";
            SqlDataAdapter adapter2 = new SqlDataAdapter();
            cmd = new SqlCommand(sqlStr2, conn2, strant2);
            adapter2.SelectCommand = cmd; 
          
            SqlCommandBuilder thisBuilder2 = new SqlCommandBuilder(adapter2);  //自动更改



            adapter2.Fill(ds, "OldShippers");    //封装到ds 新的仓库中
            DataTable dt = ds.Tables["OldShippers"];
            dt.Clear();
            DataTable dt2 = ds.Tables["Shippers"];
            foreach (DataRow dr in dt2.Rows)
            {
                dt.ImportRow(dr);
            }
            adapter2.Update(ds.Tables["OldShippers"]); //更新回数据库。。。。。
            
            //没有问题就提交呗。
            tran.Commit();
            strant2.Commit();
            conn.Close();
            conn2.Close();
        }
        catch (Exception e)
        {
            tran.Rollback();
            strant2.Rollback(); 
            Console.WriteLine(e);
        }
    }

TestReturnDB();

static DataSet TestReturnDB()
    {
        String connectionSql1 = "Data Source=127.0.0.1;Initial Catalog=TSQLFundamentals2008;User ID=sa;Password=sa123456";
        SqlConnection conn = new SqlConnection(connectionSql1);
        DataSet ds = new DataSet();
        conn.Open();

        string sqlStr = "Select  * from Sales.Shippers";
        SqlDataAdapter adapter = new SqlDataAdapter(sqlStr, conn);  //拿着令牌去 那个大仓库读取数据
        adapter.Fill(ds, "Shippers");

        conn.Close();
        return ds;
    }

////////////////////////////////////////////
//封装成EnClosure
EnClosure(ds);

 static List<Shippers> EnClosure(DataSet ds)
    {
        List<Shippers> shippers = new List<Shippers>();
        DataRowCollection drc = ds.Tables["Shippers"].Rows;
        Shippers ship = null;

        foreach (DataRow dr in drc)
        {
            ship = new Shippers();
            ship.Companyname = dr["companyname"] + "1738";
            ship.Phone = dr["phone"] + "1738";

            shippers.Add(ship);
        }
        return shippers;

    }

方法2:使用 TransactionScope,需要打开一些服务:Distributed Transaction Coordintor

static void 	TestReturnDataSetThenUpdateDBWithTransaltionByTransactionScope()
    {

        DataSet ds = TestReturnDB();
        ////////////////////////////////////////////
        //封装成EnClosure
        List<Shippers> Newshippers = EnClosure(ds);

        String connectionSql1 = "Data Source=127.0.0.1;Initial Catalog=TSQLTemp;User ID=sa;Password=sa123456";
        String connectionSql2 = "Data Source=127.0.0.1;Initial Catalog=TSQLFundamentals2008;User ID=sa;Password=sa123456";
        
        /////////////////////////////////////////// 

        try
        {
            using (TransactionScope tsCope = new TransactionScope())
            {
                using (SqlConnection conn = new SqlConnection(connectionSql1))
                {
                   // SqlDataAdapter sda = new SqlDataAdapter("select * from dbo.Shippers", conn);
                    string sqlStr = "Select top 1 * from dbo.Shippers";
                    SqlDataAdapter adapter = new SqlDataAdapter(sqlStr, conn);      //拿着令牌去 那个大仓库读取数据
                    SqlCommandBuilder thisBuilder = new SqlCommandBuilder(adapter);  //一定要添加。。。  自动更改
                    adapter.Fill(ds, "newShippers");    //封装到ds 新的仓库中

                    foreach (Shippers item in Newshippers)
                    {
                        DataRow dr = ds.Tables["newShippers"].NewRow();
                        dr["companyname"] = item.Companyname;
                        dr["phone"] = item.Phone;
                        ds.Tables["newShippers"].Rows.Add(dr);

                    }
                    //new SqlCommand(Update,connection).Parameters.Add('@参数名','类型','长度','数据库表列名')
                    //插入到新表中
                    adapter.Update(ds.Tables["newShippers"]); //更新回数据库。。。。。

                }

                //更新源表的状态
                DataRowCollection drc = ds.Tables["Shippers"].Rows;
                int count = drc.Count;
                for (int i = 0; i < count; i++)
                {
                    drc[i]["companyname"] = "UpdateStatusxxxxxxxxxxxxxx";
                }

                using (SqlConnection conn2 = new SqlConnection(connectionSql2))
                {
                    conn2.Open();
                    string sqlStr2 = "Select top 1  * from Sales.Shippers";
                    SqlDataAdapter adapter2 = new SqlDataAdapter(sqlStr2, conn2);      //拿着令牌去 那个大仓库读取数据
                    SqlCommandBuilder thisBuilder2 = new SqlCommandBuilder(adapter2);  //自动更改

                    adapter2.Fill(ds, "OldShippers");    //封装到ds 新的仓库中
                    DataTable dt = ds.Tables["OldShippers"];
                    dt.Clear();
                    DataTable dt2 = ds.Tables["Shippers"];
                    foreach (DataRow dr in dt2.Rows)
                    {
                        dt.ImportRow(dr);
                    }
                    adapter2.Update(ds.Tables["OldShippers"]); //更新回数据库。。。。。

                }
                tsCope.Complete();
            }
        }
        catch (Exception e)
        {

            Console.WriteLine(e);
        }
    }

本文地址:https://blog.csdn.net/qq_33606071/article/details/107139351