Foxtable(狐表)用户栏目专家坐堂 → [分享] 事务处理(20140305)


  共有52793人关注过本帖树形打印复制链接

主题:[分享] 事务处理(20140305)

帅哥哟,离线,有人找我吗?
逛逛
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:1693 积分:12135 威望:0 精华:7 注册:2013/7/11 10:52:00
[分享] 事务处理(20140305)  发帖心情 Post By:2013/12/28 13:09:00 [显示全部帖子]

 看见论坛上有人在做事务处理,

 

  俺也去百度了一点相关知识

 

下面是俺的初步成果,(家里没装MSSQL,所以只测试了Access)

 

 

 
图片点击可在新窗口打开查看此主题相关图片如下:jdfw.gif
图片点击可在新窗口打开查看

 

 事务处理 (网上摘抄)

事务是 一组组合成逻辑工作单元的数据库操作,在系统执行过程中可能会出错,但事务将控制和维护每个数据库的一致性和完整性。事务处理的主要特征是,任务要么全部 完成,要么都不完成。在写入一些记录时,要么写入所有记录,要么什么都不写入。如果在写入一个记录时出现了一个失败,那么在事务处理中已写入的其他数据就 会回滚。事务可能由很多单个任务构成。

简单事 务的一个常见例子:把钱从A账户转到B账户,这涉及两项任务,即从A账户把钱取出来;把钱存入B账户。两项任务要么同时成功,要么一起失败,给予回滚,以 便保持账户的状态和原来相同。否则,在执行某一个操作的时候可能会因为停电、网络中断等原因而出现故障,所以有可能更新了一个表中的行,但没有更新相关表 中的行。如果数据库支持事务,则可以将数据库操作组成一个事务,以防止因这些事件而使数据库出现不一致。

 

 

 

 

写一个函数放在这里,如果有问题,告诉我改。

 

 

 

 

 

 

      '要执行的SQL语句集合,每个集合项都是针对同一张表的同一种操作拼接语句,不要操过1000次拼接
Dim SqlList As List(of String) = Args(0)

Dim cn1 As Connection = Connections("shiwu")   '获取数据库连接,数据源名称按实际修改
Dim cn As New System.Data.OleDb.OleDbConnection(cn1.ConnectionString)
Dim cmd As new System.Data.OleDb.OleDbCommand
cn.Open()
cmd.Connection = cn
Dim j As Integer = SqlList.Count
try
    cmd.Transaction = cn.BeginTransaction()   '开始事务
    For Each sql As String In SqlList
        cmd.CommandText = sql
        cmd.ExecuteNonQuery()
    Next
    cmd.Transaction.Commit()  '提交事务
    cmd.Dispose()    '释放
    cn.Close()       '关闭连接
    Return 2   
Catch ex As Exception
    cmd.Transaction.Rollback()  '回滚事务
    msgbox("操作被取消!")      '返回错误信息
    cmd.Dispose()    '释放
    cn.Close()       '关闭连接
    Return 1      ‘返回值可以用于后续操作
End Try

 

 

函数操作示例,具体语句自己修改

Dim str As String
For i As Integer = 1 To 1000
    str += "INSERT INTO T_A (A)values('HH" & i & "');"      ’注意,拼接应该是对同一张表的同一种操作。
Next

Dim SQLLIST As NEW List(OF String)
SQLLIST.Add(str)
str = "insert into T_B values('BB')"   ‘模拟错误,是个重复值
SQLLIST.Add(str)
Functions.Execute("数据处理_事务处理",SQLLIST)    

 

 

 

 

   

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:事务处理.zip

 

20140305:

   1)使用OleDbCommandBuilder 的方法

   2)重写了事务函数

   3)弟兄们,有问题别忘了告诉我一声。

 20140307:

漏了一个重要提示:上下两种方式是不同的,各有特点。

1、如果你要自行合成SQL语句,就使用第一种方式,特点是效率高,但合成SQL语句麻烦。

2、第二种方式简单,但效率低,特别是大数据量更新的时候。但他适合狐表现有的操作方式。

       比如项目窗口中有一张主表和子表,主表删除时同时删除子表中的相应数据,点击保存时,要么同时成功,要么都失败。

      这样,就可以将大量的逻辑关系写在项目中就可以了。

 

 

 

    

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:事务处理.zip

 

[此贴子已经被作者于2015/10/4 11:15:27编辑过]

[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
逛逛
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:1693 积分:12135 威望:0 精华:7 注册:2013/7/11 10:52:00
  发帖心情 Post By:2014/3/5 16:43:00 [显示全部帖子]

更新一下,有需要的可以重下,顺带测试一下。

 回到顶部
帅哥哟,离线,有人找我吗?
逛逛
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:1693 积分:12135 威望:0 精华:7 注册:2013/7/11 10:52:00
  发帖心情 Post By:2014/3/7 11:44:00 [显示全部帖子]

以下是引用jaegea在2014-3-7 11:17:00的发言:

strSql = "Delete FROM {表3} Where 看看 = '" & Tables("表2").Current("ID") & "'" 時,為何返回的是沒有修改的錯誤代碼?在表3中看看列是有與表2的ID列相同編號的數據行的,此處的SQL語句怎麼不能執行?

自己合成SQL语句要用第一种方式

 

第二种方式的SQL是自动合成的,不能这么用

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
逛逛
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:1693 积分:12135 威望:0 精华:7 注册:2013/7/11 10:52:00
  发帖心情 Post By:2014/3/7 14:30:00 [显示全部帖子]

谢谢!


 回到顶部
帅哥哟,离线,有人找我吗?
逛逛
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:1693 积分:12135 威望:0 精华:7 注册:2013/7/11 10:52:00
  发帖心情 Post By:2014/4/28 15:57:00 [显示全部帖子]

以下是引用jiskin在2014-4-28 15:46:00的发言:


逛逛大哥,这个函数还看得懂,思路挺清晰的,就是分别执行每一条sql,为何附件2中的内部函数看的我云里雾里的,有啥区别呢?

两个是完全不同的方法

 

方法1:就是合成SQL语句进行更新

 

方法2:基本逻辑

          1、生成一个包哈所有更改数据的可更新的DataTable

          2、更新这个DataTable

          3、保存到数据库中


 回到顶部