欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SqlCommand 添加参数-与DataAdapter更新

程序员文章站 2022-07-07 19:50:48
SqlCommand 带参数,带事务。【理论基础】在2.0以前版本的 ADO.NET 中,使用 DataSet 中的更改来更新数据库时,DataAdapter 的 Update 方法每次更新数据库的一行。因为该方法循环访问指定 DataTable 中的行,所以,会检查每个 DataRow,确定是否已修改。如果该行已修改,将根据该行的 RowState 属性值调用相应的 UpdateCommand、InsertCommand 或 DeleteCommand。每一次行更新都涉及网络与数据库之间的双向数据....

SqlCommand 添加参数-与DataAdapter更新

SqlCommand 带参数,带事务。
SqlCommand 添加参数-与DataAdapter更新

【理论基础】

在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