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();//封装成EnClosureList<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();//封装成EnClosureList<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);}}

SqlCommand 添加参数-与DataAdapter更新相关推荐

  1. 前端学习(1970)vue之电商管理系统电商系统之渲染添加参数的对话框

    目录结构 router.js import Vue from 'vue' import Router from 'vue-router' import Login from './components ...

  2. 前端学习(1965)vue之电商管理系统电商系统之渲染添加参数的按钮

    目录结构 router.js import Vue from 'vue' import Router from 'vue-router' import Login from './components ...

  3. Elasticsearch如何创建索引,添加,删除,更新文档

    文章目录 准备工作 检查 es 及 Kibana 是否运行正常 创建索引及文档 创建文档相关知识点 mulit-field 字段 关于两个type的解释 关于两个keyword的解释 mulit-fi ...

  4. 开始使用Elasticsearch (1): 如何创建index,添加、删除、更新文档

    本文内容来自 https://blog.csdn.net/UbuntuTouch/article/details/99481016 ,有删减和文字修正. 在开始使用ES之前, 请安装好ES & ...

  5. main函数参数,在VS中向命令行添加参数的方法

    问题描述 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数"-a"选项执行加法,"-s"选项执行减法,"-m"选 ...

  6. Button中command后面函数添加参数解决方法

    Button中command后面函数添加参数解决方法 参考文章: (1)Button中command后面函数添加参数解决方法 (2)https://www.cnblogs.com/smart-ziha ...

  7. ajax值上传不过去,ajax上传时参数提交不更新等相关问题

    先前,我从网上下载了一个jQuery的Ajax上传插件,网页的左侧是上传分类,想要实现的一个功能是如此这样的:我本来是打算在服务端根据上传分类建立不同的文件夹来保存文件的,因此这个就需要传一个上传分类 ...

  8. Revit Family API 添加参数与尺寸标注

    使用FamilyManager其他的与普通添加参数与标注没区别. [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Man ...

  9. 向当前url添加参数

    //向当前url添加参数,没有历史记录window.history.replaceState({path: newurl}, '', newurl);function updateQueryStrin ...

最新文章

  1. jdk中自带 jstat,jconsole,jps,jmap,jhat使用
  2. android shell用户界面,shell界面下安装和卸载Android应用程序(apk包)
  3. PyTorch中Tensor的基本用法与动手学深度学习的预备知识
  4. qq空间登陆 cookie_把这篇 Session、Cookie、Token看完,和面试官随便谈人生
  5. 【Python】Tkinter图形界面设计(GUI)
  6. c语言堆栈基本代码入栈出栈_几道和「堆栈、队列」有关的面试算法题
  7. 用Typescript 开发 node.js (方法2)
  8. Linux:为什么性能工具需要 BPF 技术
  9. 单片机技术应用实训考核,AT89S52单片机应用教学,QY-KC20
  10. 如何将虚拟机上的文件复制到主机上
  11. 苹果删除照片不释放内存_别再胡乱清理垃圾了,只要删除这6个文件夹,瞬间释放20GB内存...
  12. Hibernate5
  13. Thinkphp整合微信支付功能
  14. Linux下screen命令实操
  15. 房租客手机端个人中心html页面
  16. js 生成条形码例子
  17. HTML5中引入字体样式的常用方法-Iconfont(阿里巴巴矢量图库)和IcoMoon-APP
  18. 董淳光SQLITE3使用总结
  19. 将安卓手机屏幕内容投射到电脑屏幕上
  20. 关于lvm扩容的方式

热门文章

  1. Topaz Gigapixel AI for Mac(图片无损放大软件)
  2. 基于java的在线考试系统源码
  3. 互联网平台能否扛住「五年周期律」
  4. U3d官方教程——2D UFO
  5. PHP session跨页面访问失效问题处理
  6. PHP session storage
  7. 飞信发送接口调用说明
  8. 坦克世界服务器停机维护提前结束,《坦克世界》2月25日服务器停机维护公告
  9. EOS向400亿美元的以太坊发起了进攻
  10. Vue 2 - 常见面试题汇总大全