vb6中在循环中会不会没完成循环遇到意外退出?

来自外太空的你 2014-06-29 10:47:26
vb6中会不会出现这种情况
例如
for i =1 to 1000
1.sql update语句
2.sql update语句
3.insert 语句
next

假设会不会出现在 i =500的时候,运行到第2句意外退出了呢?
出现这种意外的情况通常在什么情况下发生?
如何避免防止这种情况的发生?

请指导,谢谢
...全文
207 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
几罗星人 2014-07-03
  • 打赏
  • 举报
回复
SQL语句基本没什么问题,事务我比较少用,不算太清楚。不过有一些地方还是要说一下:

--SET是一个关键字。XACT_ABORT是一个开关,表示如果失败是否回滚整个事务。
--ON也是一个关键字,表示开关打开。这里的代开意味着回滚整个事务
--设置为OFF则只回滚出错的语句
set XACT_ABORT on
--begin tran都是关键字,后面还可以设置一个事务名,虽然从语法的角度上来说
--事务名是可选的,不过我见到其他的很多示例都有设定事务名,你可以去查一下
--有什么好处和坏处。我没说一定要有,只是说说有怎么一回事
begin tran [transaction_name] 
--实际的执行代码就是你那样写了update,insert语句别写错就行。
--最后的也没什么问题。
我自己不算很熟悉,难免错漏。下面是msdn的语法解释,其中XACT_ABORT的解释是英文的,也可以查着来看,另外两个是繁体中文的,应该也能看懂吧。 XACT_ABORT:http://msdn.microsoft.com/en-us/library/ms188792.aspx BEGIN TRANSACTION :http://msdn.microsoft.com/zh-tw/library/ms188929.aspx SET IMPLICIT_TRANSACTIONS(控制是显式事务还是隐式事务):http://msdn.microsoft.com/zh-cn/library/ms187807.aspx
litaoa 2014-07-03
  • 打赏
  • 举报
回复
肯定会,一般得做个校验程序吧。
  • 打赏
  • 举报
回复
引用 16 楼 JiLuoXingRen 的回复:
[quote=引用 15 楼 u010526292 的回复:] [quote=引用 14 楼 JiLuoXingRen 的回复:] 修正一下:除非你想一个新增不行别的都不新增了,但是一般不会有这样的要求吧~
sql语句实现调试过的都没问题的,呵呵,我只想要,要执行3条要么全部完成,要么3条不完成,不想出现完成其中1条意外退出,而我的理解是理论上存储过程应该可以解决我这个问题 不知我的理解是否正确 请指点,谢谢[/quote] 要执行3条要么全部完成,要么3条不完成那就是事务。存储过程只是SQL语句的集合,并不保证要么全部完成,要么都不完成。储存过程用于大量的SQL语句,但是又不需要数据库反馈什么的情况。例如一千几百条的新增操作,如果不是错误数据库不需要回复你什么,而你如果一条条发送SQL语句虽然也可以,但是会大幅增加数据流转的开销,例如做1000次的循环来发送SQL语句,和一个储存过程包含了1000条SQL语句的操作一次性发给数据库,显然是后者要快的,不要以为你的代码才是代码,for语句每一次都要判断循环变量是否到达预定的循环终止值,循环变量增加,这些都是开销。 所以想要执行3条要么全部完成,要么3条不完成那就用事务。去看看事务的内容吧~[/quote] 今天去看了事务的知识,想问一下事务也是写在存储过程中的 例如: set XACT_ABORT on ‘网上说这个必须有 begin tran 1.update 表1 2.update 表2 3.insert 表3 commit tran 如此就可以解决了么? 第2句没成功,自动回滚么? 还望指点,谢谢!
几罗星人 2014-07-02
  • 打赏
  • 举报
回复
引用 15 楼 u010526292 的回复:
[quote=引用 14 楼 JiLuoXingRen 的回复:] 修正一下:除非你想一个新增不行别的都不新增了,但是一般不会有这样的要求吧~
sql语句实现调试过的都没问题的,呵呵,我只想要,要执行3条要么全部完成,要么3条不完成,不想出现完成其中1条意外退出,而我的理解是理论上存储过程应该可以解决我这个问题 不知我的理解是否正确 请指点,谢谢[/quote] 要执行3条要么全部完成,要么3条不完成那就是事务。存储过程只是SQL语句的集合,并不保证要么全部完成,要么都不完成。储存过程用于大量的SQL语句,但是又不需要数据库反馈什么的情况。例如一千几百条的新增操作,如果不是错误数据库不需要回复你什么,而你如果一条条发送SQL语句虽然也可以,但是会大幅增加数据流转的开销,例如做1000次的循环来发送SQL语句,和一个储存过程包含了1000条SQL语句的操作一次性发给数据库,显然是后者要快的,不要以为你的代码才是代码,for语句每一次都要判断循环变量是否到达预定的循环终止值,循环变量增加,这些都是开销。 所以想要执行3条要么全部完成,要么3条不完成那就用事务。去看看事务的内容吧~
  • 打赏
  • 举报
回复
引用 10 楼 JiLuoXingRen 的回复:
[quote=引用 5 楼 caozhy 的回复:] [quote=引用 4 楼 u010526292 的回复:] 意思是我用sql语句写存储过程,用vb传递参数,对吗?
那个zhao4专门捣乱的。 事务当然可以在VB中使用: http://wenku.baidu.com/link?url=o47Xt51SASsEraALsiuSuH3uhz17crq2Dol_5Cjfu_DRdtH_IObdJSSHmn0AlTScIR-BkwNZzMHLAhaEgGCvbF6ySrcA0fa5dzbaUM-VGfe[/quote] 斑竹,事务确实是在SQL中实现的,zhao4zhong1并没有说不能再VB中使用。 回复贴主:
引用 2 楼 u010526292 的回复:
如果第1种情况不存在,有没有可能因为机器得原因而退出?如何使用事务?请给一个例子,谢谢。
一切皆有可能。既然第一种情况,也就是代码逻辑出现问题的情况假设不存在,那么要说意外退出,只有说你传入了非法的值用于更新,这时候数据库会报告当前的问题(以怎么样的形式报告就看不同的数据库了)。必须明确的是,只要你的1.sql update语句,2.sql update语句,3.insert 语句没写错,那么出问题一定是数据库的问题。如果数据库引发一个错误,你可以使用on error goto去通过错误号捕获错误,并在捕获之后尝试修正它。但是另一个问题是,如果数据库也崩了~,那是没办法的,你用事物也无补于事,事物只是在数据库系统安全运行的情况下,全部完成(或全部不完成)你交付的工作。 所以总结起来, 1.你的程序本身崩溃导致的意外退出:一定存在代码上的问题,检查修复代码即可 2.对数据库的不当操作(包括SQL语句写错,更新字段用的新值不符合定义等):SQL语句写错检查修复即可。更新字段用的新值不符合定义等,尝试各种手段获取数据库报告的问题:如果数据库引发一个错误,可以使用on error goto去通过错误号捕获错误,并在捕获之后尝试修正它;也有可能在数据库对象中存在error,geterror之类的方法,来帮助你获得最新的错误信息,你应该在执行SQL语句后在你的代码中检查这些内容。 3.数据库全面崩溃型:没救了…… 4.事务适用于保障数据库完整性的设计,例如需要依次更新A表和B表,B表的xxx字段的值取自A表的ID字段,这样显然会有一个问题,如果A表在前面更新失败,然后B表继续更新,xxx字段将无法使用A表ID字段中的新值。所以为了保证B表能够更新成功,A表必须成功,为此而使用事物,如果A表失败,那么B表也不更新了,只有当A成功且B也成功才执行,任一失败数据库都会回滚当前已有的操作[/quote] 意思是说如果sql语句没有错误的话,就不会出错,对吗? 另外,问一下,如果是第一种情况发生,用户自我中断,那调用存储过程的话也会确保1个整体完成,而不会出现像3句执行只1句这种情况的发生,可以这么理解吗? 谢谢 因为,我在编写库存管理的程序,考虑到,3句是一个整体,需要一个整体完成,即使后面意外中断,确保一个整条能完成就可以了 谢谢 还望指导
  • 打赏
  • 举报
回复
引用 14 楼 JiLuoXingRen 的回复:
修正一下:除非你想一个新增不行别的都不新增了,但是一般不会有这样的要求吧~
sql语句实现调试过的都没问题的,呵呵,我只想要,要执行3条要么全部完成,要么3条不完成,不想出现完成其中1条意外退出,而我的理解是理论上存储过程应该可以解决我这个问题 不知我的理解是否正确 请指点,谢谢
几罗星人 2014-07-01
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
[quote=引用 4 楼 u010526292 的回复:] 意思是我用sql语句写存储过程,用vb传递参数,对吗?
那个zhao4专门捣乱的。 事务当然可以在VB中使用: http://wenku.baidu.com/link?url=o47Xt51SASsEraALsiuSuH3uhz17crq2Dol_5Cjfu_DRdtH_IObdJSSHmn0AlTScIR-BkwNZzMHLAhaEgGCvbF6ySrcA0fa5dzbaUM-VGfe[/quote] 贴主,斑竹提供的文档虽然在事务方面对你当前的问题帮助不大,不过本身还是很有价值的,其中演示了如何使用on error goto 语句捕获数据库引发的错误,并尝试修正这些错误。
几罗星人 2014-07-01
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
[quote=引用 4 楼 u010526292 的回复:] 意思是我用sql语句写存储过程,用vb传递参数,对吗?
那个zhao4专门捣乱的。 事务当然可以在VB中使用: http://wenku.baidu.com/link?url=o47Xt51SASsEraALsiuSuH3uhz17crq2Dol_5Cjfu_DRdtH_IObdJSSHmn0AlTScIR-BkwNZzMHLAhaEgGCvbF6ySrcA0fa5dzbaUM-VGfe[/quote] 斑竹,事务确实是在SQL中实现的,zhao4zhong1并没有说不能再VB中使用。 回复贴主:
引用 2 楼 u010526292 的回复:
如果第1种情况不存在,有没有可能因为机器得原因而退出?如何使用事务?请给一个例子,谢谢。
一切皆有可能。既然第一种情况,也就是代码逻辑出现问题的情况假设不存在,那么要说意外退出,只有说你传入了非法的值用于更新,这时候数据库会报告当前的问题(以怎么样的形式报告就看不同的数据库了)。必须明确的是,只要你的1.sql update语句,2.sql update语句,3.insert 语句没写错,那么出问题一定是数据库的问题。如果数据库引发一个错误,你可以使用on error goto去通过错误号捕获错误,并在捕获之后尝试修正它。但是另一个问题是,如果数据库也崩了~,那是没办法的,你用事物也无补于事,事物只是在数据库系统安全运行的情况下,全部完成(或全部不完成)你交付的工作。 所以总结起来, 1.你的程序本身崩溃导致的意外退出:一定存在代码上的问题,检查修复代码即可 2.对数据库的不当操作(包括SQL语句写错,更新字段用的新值不符合定义等):SQL语句写错检查修复即可。更新字段用的新值不符合定义等,尝试各种手段获取数据库报告的问题:如果数据库引发一个错误,可以使用on error goto去通过错误号捕获错误,并在捕获之后尝试修正它;也有可能在数据库对象中存在error,geterror之类的方法,来帮助你获得最新的错误信息,你应该在执行SQL语句后在你的代码中检查这些内容。 3.数据库全面崩溃型:没救了…… 4.事务适用于保障数据库完整性的设计,例如需要依次更新A表和B表,B表的xxx字段的值取自A表的ID字段,这样显然会有一个问题,如果A表在前面更新失败,然后B表继续更新,xxx字段将无法使用A表ID字段中的新值。所以为了保证B表能够更新成功,A表必须成功,为此而使用事物,如果A表失败,那么B表也不更新了,只有当A成功且B也成功才执行,任一失败数据库都会回滚当前已有的操作
几罗星人 2014-07-01
  • 打赏
  • 举报
回复
修正一下:除非你想一个新增不行别的都不新增了,但是一般不会有这样的要求吧~
几罗星人 2014-07-01
  • 打赏
  • 举报
回复
引用 12 楼 u010526292 的回复:
意思是说如果sql语句没有错误的话,就不会出错,对吗? 另外,问一下,如果是第一种情况发生,用户自我中断,那调用存储过程的话也会确保1个整体完成,而不会出现像3句执行只1句这种情况的发生,可以这么理解吗? 谢谢 因为,我在编写库存管理的程序,考虑到,3句是一个整体,需要一个整体完成,即使后面意外中断,确保一个整条能完成就可以了 谢谢 还望指导
基本是这样的,如果你自己代码没写错,SQL语句没错,数据库不崩溃,那还会出什么问题?停电吗?在另外的不可预知的问题上不必纠结。另外,如果是你的代码在提交事务之后出了问题,理论上来说数据库会完成事务的吧,这很难说,因为你的程序与数据库相连,如果数据库发现连接中断的话他那方面也可能撒手不管(也有可能很负责任地回滚事务已经执行的部分),要看数据库。如果三条操作有相互关联,后面的执行需要前面完成的保证,那么建议使用事务去保证。但是如果是三句新增,彼此无关就不必了,当然,这种情况下你用了事务也不会有问题,除非你想一个新增不想去别的都不新增了,但是一般不会有这样的要求吧~
threenewbee 2014-06-30
  • 打赏
  • 举报
回复
(1)会。如果代码逻辑中引发了运行时错误,甚至在循环中用户强行关闭了程序。 (2)使用事务,确保要么所有操作全部执行,要么全部不执行。
  • 打赏
  • 举报
回复
意思是我用sql语句写存储过程,用vb传递参数,对吗?
赵4老师 2014-06-30
  • 打赏
  • 举报
回复
事务是在SQL存储过程中实现而非在VB代码中实现。
  • 打赏
  • 举报
回复
引用 8 楼 caozhy 的回复:
不能保证不7意外退出。
那这是为什么呢?我已经将3句化为一个存储过程整体 例如 在 i=500处发生意外,程序退出,应该会是2钟情况把 要么,参数没有传到存储过程,存储过程没有执行 要么,参数传到存储过程,程序意外退出,那这好像不影响存储过程的执行把? 不懂还望指点 谢谢诶
threenewbee 2014-06-30
  • 打赏
  • 举报
回复
不能保证不7意外退出。
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
http://msdn.microsoft.com/zh-cn/dd263040 虽然这篇文章说的是VB.NET,但是对于事务的概念,你可以学习下。
你好版主如果,这样 for i = 1 to 1000 存储过程 next 这样应该不会出现在突然执行中间一句意外退出把,要么完成存储过程的这一个整体,要么补完成,对吗?
threenewbee 2014-06-30
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/dd263040 虽然这篇文章说的是VB.NET,但是对于事务的概念,你可以学习下。
threenewbee 2014-06-30
  • 打赏
  • 举报
回复
引用 4 楼 u010526292 的回复:
意思是我用sql语句写存储过程,用vb传递参数,对吗?
那个zhao4专门捣乱的。 事务当然可以在VB中使用: http://wenku.baidu.com/link?url=o47Xt51SASsEraALsiuSuH3uhz17crq2Dol_5Cjfu_DRdtH_IObdJSSHmn0AlTScIR-BkwNZzMHLAhaEgGCvbF6ySrcA0fa5dzbaUM-VGfe
  • 打赏
  • 举报
回复
如果第1种情况不存在,有没有可能因为机器得原因而退出?如何使用事务?请给一个例子,谢谢。

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧