解决方案 »

  1.   

    事务是在SQL存储过程中实现而非在VB代码中实现。
      

  2.   

    意思是我用sql语句写存储过程,用vb传递参数,对吗?
      

  3.   


    那个zhao4专门捣乱的。事务当然可以在VB中使用:
    http://wenku.baidu.com/link?url=o47Xt51SASsEraALsiuSuH3uhz17crq2Dol_5Cjfu_DRdtH_IObdJSSHmn0AlTScIR-BkwNZzMHLAhaEgGCvbF6ySrcA0fa5dzbaUM-VGfe
      

  4.   

    http://msdn.microsoft.com/zh-cn/dd263040
    虽然这篇文章说的是VB.NET,但是对于事务的概念,你可以学习下。
      

  5.   


    你好版主如果,这样
    for i = 1 to 1000存储过程next这样应该不会出现在突然执行中间一句意外退出把,要么完成存储过程的这一个整体,要么补完成,对吗?
      

  6.   


    那个zhao4专门捣乱的。事务当然可以在VB中使用:
    http://wenku.baidu.com/link?url=o47Xt51SASsEraALsiuSuH3uhz17crq2Dol_5Cjfu_DRdtH_IObdJSSHmn0AlTScIR-BkwNZzMHLAhaEgGCvbF6ySrcA0fa5dzbaUM-VGfe
    斑竹,事务确实是在SQL中实现的,zhao4zhong1并没有说不能再VB中使用。回复贴主:
    一切皆有可能。既然第一种情况,也就是代码逻辑出现问题的情况假设不存在,那么要说意外退出,只有说你传入了非法的值用于更新,这时候数据库会报告当前的问题(以怎么样的形式报告就看不同的数据库了)。必须明确的是,只要你的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也成功才执行,任一失败数据库都会回滚当前已有的操作
      

  7.   


    那个zhao4专门捣乱的。事务当然可以在VB中使用:
    http://wenku.baidu.com/link?url=o47Xt51SASsEraALsiuSuH3uhz17crq2Dol_5Cjfu_DRdtH_IObdJSSHmn0AlTScIR-BkwNZzMHLAhaEgGCvbF6ySrcA0fa5dzbaUM-VGfe贴主,斑竹提供的文档虽然在事务方面对你当前的问题帮助不大,不过本身还是很有价值的,其中演示了如何使用on error goto 语句捕获数据库引发的错误,并尝试修正这些错误。
      

  8.   


    那个zhao4专门捣乱的。事务当然可以在VB中使用:
    http://wenku.baidu.com/link?url=o47Xt51SASsEraALsiuSuH3uhz17crq2Dol_5Cjfu_DRdtH_IObdJSSHmn0AlTScIR-BkwNZzMHLAhaEgGCvbF6ySrcA0fa5dzbaUM-VGfe
    斑竹,事务确实是在SQL中实现的,zhao4zhong1并没有说不能再VB中使用。回复贴主:
    一切皆有可能。既然第一种情况,也就是代码逻辑出现问题的情况假设不存在,那么要说意外退出,只有说你传入了非法的值用于更新,这时候数据库会报告当前的问题(以怎么样的形式报告就看不同的数据库了)。必须明确的是,只要你的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也成功才执行,任一失败数据库都会回滚当前已有的操作意思是说如果sql语句没有错误的话,就不会出错,对吗?
    另外,问一下,如果是第一种情况发生,用户自我中断,那调用存储过程的话也会确保1个整体完成,而不会出现像3句执行只1句这种情况的发生,可以这么理解吗?
    谢谢
    因为,我在编写库存管理的程序,考虑到,3句是一个整体,需要一个整体完成,即使后面意外中断,确保一个整条能完成就可以了
    谢谢
    还望指导
      

  9.   

    基本是这样的,如果你自己代码没写错,SQL语句没错,数据库不崩溃,那还会出什么问题?停电吗?在另外的不可预知的问题上不必纠结。另外,如果是你的代码在提交事务之后出了问题,理论上来说数据库会完成事务的吧,这很难说,因为你的程序与数据库相连,如果数据库发现连接中断的话他那方面也可能撒手不管(也有可能很负责任地回滚事务已经执行的部分),要看数据库。如果三条操作有相互关联,后面的执行需要前面完成的保证,那么建议使用事务去保证。但是如果是三句新增,彼此无关就不必了,当然,这种情况下你用了事务也不会有问题,除非你想一个新增不想去别的都不新增了,但是一般不会有这样的要求吧~
      

  10.   

    sql语句实现调试过的都没问题的,呵呵,我只想要,要执行3条要么全部完成,要么3条不完成,不想出现完成其中1条意外退出,而我的理解是理论上存储过程应该可以解决我这个问题
    不知我的理解是否正确
    请指点,谢谢
      

  11.   

    sql语句实现调试过的都没问题的,呵呵,我只想要,要执行3条要么全部完成,要么3条不完成,不想出现完成其中1条意外退出,而我的理解是理论上存储过程应该可以解决我这个问题
    不知我的理解是否正确
    请指点,谢谢
    要执行3条要么全部完成,要么3条不完成那就是事务。存储过程只是SQL语句的集合,并不保证要么全部完成,要么都不完成。储存过程用于大量的SQL语句,但是又不需要数据库反馈什么的情况。例如一千几百条的新增操作,如果不是错误数据库不需要回复你什么,而你如果一条条发送SQL语句虽然也可以,但是会大幅增加数据流转的开销,例如做1000次的循环来发送SQL语句,和一个储存过程包含了1000条SQL语句的操作一次性发给数据库,显然是后者要快的,不要以为你的代码才是代码,for语句每一次都要判断循环变量是否到达预定的循环终止值,循环变量增加,这些都是开销。所以想要执行3条要么全部完成,要么3条不完成那就用事务。去看看事务的内容吧~
      

  12.   

    sql语句实现调试过的都没问题的,呵呵,我只想要,要执行3条要么全部完成,要么3条不完成,不想出现完成其中1条意外退出,而我的理解是理论上存储过程应该可以解决我这个问题
    不知我的理解是否正确
    请指点,谢谢
    要执行3条要么全部完成,要么3条不完成那就是事务。存储过程只是SQL语句的集合,并不保证要么全部完成,要么都不完成。储存过程用于大量的SQL语句,但是又不需要数据库反馈什么的情况。例如一千几百条的新增操作,如果不是错误数据库不需要回复你什么,而你如果一条条发送SQL语句虽然也可以,但是会大幅增加数据流转的开销,例如做1000次的循环来发送SQL语句,和一个储存过程包含了1000条SQL语句的操作一次性发给数据库,显然是后者要快的,不要以为你的代码才是代码,for语句每一次都要判断循环变量是否到达预定的循环终止值,循环变量增加,这些都是开销。所以想要执行3条要么全部完成,要么3条不完成那就用事务。去看看事务的内容吧~今天去看了事务的知识,想问一下事务也是写在存储过程中的
    例如:
    set XACT_ABORT on  ‘网上说这个必须有
    begin tran
    1.update 表1
    2.update 表2
    3.insert   表3
    commit tran
    如此就可以解决了么?
    第2句没成功,自动回滚么?
    还望指点,谢谢!
      

  13.   

    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