请问vb的多数据库事物处理是如何处理的?

peaty 2003-09-02 12:25:31
多谢!
...全文
253 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoki 2003-09-17
  • 打赏
  • 举报
回复
你将这些关联的数据库操作(也就是你所谓得多数据库)放在一个事务里就可以啊
cansum396 2003-09-08
  • 打赏
  • 举报
回复
你加一个事务就可以了
BEGIN TRAN
--生成WS中业务员汇总销售
SELECT CREATE_BY,
SUM(QTY*CAST(PRICE AS MONEY)*CUR_RATE/(1+TAX_RATE)) AS SIAMOUNT,
SUM(QTY*CAST(AVG_COST AS MONEY)) AS SICOST,
(SUM(QTY*CAST(PRICE AS MONEY)*CUR_RATE/(1+TAX_RATE)) -SUM(QTY*CAST(AVG_COST AS MONEY))) AS SINP
FROM SI AS H ,SI_DETAIL AS D
WHERE H.SI_NO=D.SI_NO AND DATE_CREATE BETWEEN @BEGINDATE AND @ENDDATE
GROUP BY CREATE_BY

--生成WSCH中业务员汇总销售
SELECT CREATE_BY,
SUM(QTY*CAST(PRICE AS MONEY)*CUR_RATE) AS SIAMOUNT,
SUM(QTY*CAST(AVG_COST AS MONEY)) AS SICOST,
(SUM(QTY*CAST(PRICE AS MONEY)*CUR_RATE) -SUM(QTY*CAST(AVG_COST AS MONEY))) AS SINP
FROM WSCH.DBO.SI AS H ,WSCH.DBO.SI_DETAIL AS D
WHERE H.SI_NO=D.SI_NO AND DATE_CREATE BETWEEN @BEGINDATE AND @ENDDATE
GROUP BY CREATE_BY
COMMIT TRANSACTION
junwhj 2003-09-07
  • 打赏
  • 举报
回复
1、一个事务只对当前联接有效;
2、同时操作多个数据库,应当使用多个联接;
3、这不是事务嵌套;
4、当其中一个数据库操作失败时,将所有事务RoolBack。
peaty 2003-09-07
  • 打赏
  • 举报
回复
多谢你的解答
不过我还有疑问 :
1、我同时操作多个数据库,确实是多个连接
2、未结束第一个事务开始第二个事务,系统 给我的提示是 :不能嵌套事务
所以我还是无法实现我的目的
希望能得到你更详细的帮助,多谢多谢!
peaty 2003-09-05
  • 打赏
  • 举报
回复
多个数据库,一个事务,分别连接怎么做?
yijiansong 2003-09-05
  • 打赏
  • 举报
回复
多数据库用多个连接分别处理即可
peaty 2003-09-05
  • 打赏
  • 举报
回复
这是多数据库吗?
strongfisher 2003-09-05
  • 打赏
  • 举报
回复
.addnew
.fields(0).value=text1.text
.................
.update
end with
for i=0 to txt.count-1
with rsdetail
.addnew
.fields(i).value=txt(i).text
...........
.update
end with
next
cn.CommitTrans
exit sub
InsertErr:
cn.RollbackTrans
msgbox "ERROR",vbinformation,"AAA"
end sub
第三:(大型数据库SQL Server)
private sub TSave()
dim sqlstr as string
sqlstr="Begin trans insert into table(field1,....fieldn) values(value1,value2.....valuen) comm trans"
cn.execute(sqlstr)
end sub
strongfisher 2003-09-05
  • 打赏
  • 举报
回复
第一:
private sub TSave()
cn.begintrans
on error goto InsertErr
cn.execute(SQL语句)
cn.CommitTrans
exit sub
InsertErr:
cn.RollbackTrans
msgbox "ERROR",vbinformation,"AAA"
end sub
第二:
private sub TSave()
dim rsMain as new adodb.recordset‘主表
dim rsDetail as new adodb.recordset’明细表
连接自己写
cn.begintrans
on error goto InsertErr
 with rsmain
peaty 2003-09-05
  • 打赏
  • 举报
回复
你这个倒是多数据库
可是好象没有 事务在里面吧
cansum396 2003-09-05
  • 打赏
  • 举报
回复
给你一个例子.数据库有两个:分别是WS,WSCH;此存储过程在WS中
--生成WS中业务员汇总销售
SELECT CREATE_BY,
SUM(QTY*CAST(PRICE AS MONEY)*CUR_RATE/(1+TAX_RATE)) AS SIAMOUNT,
SUM(QTY*CAST(AVG_COST AS MONEY)) AS SICOST,
(SUM(QTY*CAST(PRICE AS MONEY)*CUR_RATE/(1+TAX_RATE)) -SUM(QTY*CAST(AVG_COST AS MONEY))) AS SINP
FROM SI AS H ,SI_DETAIL AS D
WHERE H.SI_NO=D.SI_NO AND DATE_CREATE BETWEEN @BEGINDATE AND @ENDDATE
GROUP BY CREATE_BY

--生成WSCH中业务员汇总销售
SELECT CREATE_BY,
SUM(QTY*CAST(PRICE AS MONEY)*CUR_RATE) AS SIAMOUNT,
SUM(QTY*CAST(AVG_COST AS MONEY)) AS SICOST,
(SUM(QTY*CAST(PRICE AS MONEY)*CUR_RATE) -SUM(QTY*CAST(AVG_COST AS MONEY))) AS SINP
FROM WSCH.DBO.SI AS H ,WSCH.DBO.SI_DETAIL AS D
WHERE H.SI_NO=D.SI_NO AND DATE_CREATE BETWEEN @BEGINDATE AND @ENDDATE
GROUP BY CREATE_BY
请注意看"FROM WSCH.DBO.SI AS H ,WSCH.DBO.SI_DETAIL AS D"这一句.
你可以把存储过程改成VB程序代码.这个不用我教你了吧???
:)
dary_zhou 2003-09-05
  • 打赏
  • 举报
回复
做一个变量,如果有一个数据库处理不成功,的话退回所有的不就可以 了
KJ_Wang 2003-09-05
  • 打赏
  • 举报
回复
如果你正在用的是SQL Server数据库,你可以链接服务器,然后再在你操作的SQL Server服务器时写事务就可以了,包括文本也可以做到,但是如果你操作的时Access,Txt,Excel文件的话,就不行了,哈哈!!
如果数据库全是SQL Server肯定没问题。Sybase与Orcale我不知道能不能行,反正没做过。
peaty 2003-09-04
  • 打赏
  • 举报
回复
up
peaty 2003-09-04
  • 打赏
  • 举报
回复
多数据库就多事务 怕不行吧,我需要一个事务处理,如果某个数据库操作失败,其他的要全部退回,多个事务行吗?

至于事务嵌套我试了,系统提示:不能嵌套事务
第一个事务未结束开始第二个事务是不行的
我的环境:vb6,sql server2000/
不知道哪位清楚,多谢多谢
ybcaa 2003-09-04
  • 打赏
  • 举报
回复
connA.begintrans '开始事务A
connB.begintrans '开始事务B
connA.execute " ..."
connB.execute " ..."
connA.committrans '提交事务A
connB.committrans '提交事务B
exit sub
errsave:
connA.rollbacktrans '回滚事务A
connB.rollbacktrans '回滚事务B
msgbox "数据提交失败!"
exit sub
end sub
yijiansong 2003-09-04
  • 打赏
  • 举报
回复
支持楼上
wdwd05 2003-09-04
  • 打赏
  • 举报
回复
多数据库就用多个事务来处理,事务的多少和数据库的多少没有关系~

你如果有什么问题,在具体分析吧~

其余的与楼上相同~
peaty 2003-09-02
  • 打赏
  • 举报
回复
多谢二位,不过我要的是

多 数据库 的事务处理
单数据库的我是知道的
lihonggen0 2003-09-02
  • 打赏
  • 举报
回复
VB的事务处理包括以BeginTrans开始,
以CommitTrans或Rollback结尾的多条数据库操作指令.
事务处理除了能很好的保证数据库的完整性以外.同时能大大提高数据库批量更新的效率.这是因为如果数据库更新操作没有使用事务处理,则每次Update操作都会引起数据库写盘一次.
使用事务处理后,更新只在内存缓冲区内进行,执行CommitTrans时才将所有修改一次写回到磁盘中.使用事务处理要注意一下几点:
(1)事务处理要有很完善的错误检查机制;
(2)因为VB在事务处理结束前对数据库使用了页面锁.所以在多用户环境中,如果事务被挂起,则其他用户将无法访问上锁的数据.
加载更多回复(1)
存取对象变量库结构作为一个功能较完备的Windows软件开发平台,Visual Basic专业版提供了对数据库应用的强大支持。尤其提供了使用数据控件和绑定控制项,使用数据库存取对象变量(Data Access Object Variable),直接调用ODBC 2.0 API接口函数等三种访问数据库的方法。对其标准内置的Ms Access数据库,它可以提供不弱于专业数据库软件的支持,可以进行完整的数据库维护、操作及其事务处理。在VB中,将非Access数据库称为外来数据库。对于FoxPro、dBASE、Paradox等外来数据库。虽然借助VB的Data Manager 能够对这些数据库进行NEW、OPEN、DESIGN、DELETE等操作,但在应用程序的运行状态中并不能从底层真正实现这些功能。本文从使用数据库存取对象变量的方法出发,实现了非Access格式数据库(以FoxPro数据库为例)的建新库、拷贝数据库结构、动态调入等操作,阐述了从编程技巧上弥补VB对这些外来数据库支持不足的可行性 。 一 、 VB数据库的体系结构具体的VB数据库结构。 VB数据库的核心结构是所谓的MicroSoft JET数据库引擎,JET引擎的作用就像是一块"面 板",在其上可以插入多种ISAM(Indexed Sequential Access Method,即索引顺序存取方 法) 数据驱动程序。JET引擎为Access格式数据库提供了直接的内部(build-in)支持,这就是VB对Access数据库具有丰富支持的真正原因。 VB专业版中提供了FoxPro、dBASE(或 Xbase)、Paradox、Btrieve等数据库的ISAM驱动程序,这就使得VB能支持这些数据库格 式。另外,其他的许多兼容ISAM的驱动程序也可以通过从厂商的售后服务得到。因而从理论上说,VB能支持所有兼容ISAM的数据库格式(前提是只需获得这些数据库的ISAM驱动接口程序)。 由上可见,Ms JET引擎实质上提供了:一个符合ANSI标准的语法分析器;为查询结果集的使用而提供的内存管理功能;同所支持的数据库的外部接口;为应用代码提供的内部接口。实际上,在VB中从一种数据库类型转化为另一种数据库类型几乎不需要或只需要很少的代码修改。而且,尽管dBASE、Paradox本身的DDL (Data Definition Language,即数据定义语言)和DML(Data Manipulation Language,即数据操纵语言)是非结构化查询的,但它们仍然可以使用VB的SQL语句和JET引擎来操纵。 从VB的程序代码的角度来看,ODBC,ISAM驱动程序以及Ms Access数据库的整个外部结构够可以统一为一个一致的编程接口。也即是说,提供给VB应用程序员的记录集对象视图同所使用的数据库格式及类型是相互独立的。即对FoxPro等数据库仍然可以使用众多的数据库存取对象变量,这就为非Access数据库的访问提供了最重要的方法。   二 、使用非Access数据库时的参数设置及配置文件的参数读取如果在VB的程序中使用了数据库的操作,将应用程序生成EXE文件或打包生成安装程序后,则必须提供一个配置 (.INI)文件,在INI文件中可以对不同类型的数据库进行设置。如果找不到这个INI文件, 将会导致不能访问数据库。通常情况下,INI文件的文件名和应用程序的名称相同,所以如果没有指明,VB的程序会在Windows子目录中去找和应用程序同名的INI文件。可以使用VB中的SetDataAccessOptions语句来设置INI文件。 SetDataAccessOptions语句的用法如下:SetDataAccessOptions 1 ,IniFileName其中IniFileName参数指明的是INI文件的带路径的文件名。值得注意的是,当应用程序找不到这个INI文件时,或在调用 OpenDataBase函数时对其Connect参数值没有设定为VB规定的标准值,如对FoxPro 2.5格式设定为了" FoxPro;"(应为" FoxPro 2.5; "),或者没有安装相应的ISAM驱动程序,则此时VB会显示一条错误信息" Not Found Installable ISAM "。通常,INI文件在应用程序分发出去以前已经生成,或者在安装时动态生成,也可以在应用程序中自己生成。 通常这种 INI文件中有" [Options]"、"[ISAM]"、" [Installed ISAMs]"、"[FoxPro ISAM]"、"[dBASE ISAM] " 、" [Paradox ISAM] "等设置段,对于一个完整的应用程序则还应有一个属于应用 程序自己的设置段如" [MyDB]”。可在其中设置DataType、Server、DataBase、 OpenOnStartup、DisplaySQL、QueryTimeOut等较为重要的数据库参数,并以此限定应用程序一般的运行环境。 Windows API接口函数在Kernel.exe动态链接库中提供了一个OSWritePrivateProfileString函数,此函数能按Windows下配置文件(.INI)的书写格式写入信息。 在通常情况下,应用程序还需要在运行时读取配置文件内相关项的参数。比如PageTimeOut(页加锁超时时限)、MaxBufferSize(缓冲区大小)、LockRetry(加锁失败时重试次数)等参数,通过对这些参数的读取对应用程序运行环境的设定、潜在错误的捕获等均会有很大的改善。 设此应用程序的配置文件为MyDB.INI,则具体过程如下:Funtion GetINIString$( Byval Fname$ ,Byval szItem$ ,Byval szDeFault$ ) ' 此自定义子函数实现INI 文件内设置段内参数的读取Dim Tmp As String,x As Integer Tmp = String( 2048,32 ) x = OSGetPrivateProfileString(Fname$,szItem$ , szDefault$,Tmp,Len(Tmp) ," MyDB.INI " ) GetINIString = Mid$( Tmp,1,x ) EndFunction以下这些函数的声明可写在模块文件内,且每个函数的声明必须在一行内Declare Function OSGetPrivateProfileString% Lib "Kernel" Alias "GetPrivateProfileString" (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal ReturnString$, ByVal NumBytes As Integer, ByVal FileName$) Declare Function OSWritePrivateProfileString% Lib "Kernel" Alias "WritePrivateProfileString" (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal FileName$) Declare Function OSGetWindowsDirectory% Lib "Kernel" Alias "GetWindowsDirectory" (ByVal a$, ByVal b%) Sub Form1_Load( ) Dim st As String Dim x As Integer Dim tmp As String tmp = String$( 255, 32 ) ' INI文件内为各种数据库格式指明已安装的相应ISAM驱动程序x = OSWritePrivateProfileString(" Installable ISAMS", "Paradox 3.X", "PDX110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "dBASE III", "XBS110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "dBASE IV", "XBS110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "FoxPro 2.0", "XBS110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "FoxPro 2.5", "XBS110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "Btrieve", "BTRV110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "dBase ISAM", "Deleted", "On", "MyDB.INI" ) ' 指明 INI文件的位置x = OSGetWindowsDirectory( tmp, 255 ) st = Mid$( tmp, 1, x ) SetDataAccessOption 1, st + "\mydb.ini" '获得INI文件一些参数 gwMaxGridRows = Val(GetINIString( " MyDB.INI " ,"MaxRows", "250" )) glQueryTimeout = Val(GetINIString( " MyDB.INI " ,"QueryTimeout", "5" )) glLoginTimeout = Val(GetINIString( " MyDB.INI " ,"LoginTimeout", "20" )) End Sub   三 、数据存取对象变量对外来数据库编程的方法及其实例在VB专业版数据库编程的三种方法中,第二种-使用数据库存取对象变量(DAO)的方法最具有功能强大、灵活的特点。 它能够在程序中存取ODBC 2.0的管理函数;可以控制多种记录集类型:Dynaset,Snapshot 及Table记录集合对象;可以存储过程和查询动作;可以存取数据库集合对象,例如 TableDefs,Fields,Indexes及QueryDefs;具有真正的事物处理能力。因而,这种方法对数据库处理的大多数情况都非常适用。 由于VB中的记录集对象与所使用的数据库格式及类型是相互独立的,所以在非Access数据库中也可以使用数据库存取对象变量的方法。因而 对FoxPro等外来数据库而言,使用数据库存取对象变量的方法同样也是一种最佳的选择。 有一点需要注意的是,VB的标准版中仅能使用数据控件(Data Control)对数据库中的记录进行访问,主要的数据库存取对象中也仅有Database、Dynaset对象可通过数据控件的属 性提供,其它的重要对象如TableDef、Field、Index、QueryDef、Snapshot、Table等均不能在VB的标准版中生成,所以使用数据存取对象变量的方法只能用VB 3.0以上的专业版。 (一)、非Access数据库的新建及库结构的修改VB专业版中的数据库存取对象变量可以分为两类,一类用于数据库结构的维护和管理,另一类用于数据的存取。其中表示数据库结构时可以使用下面的对象: DataBase、TableDef、Field、Index,以及三个集合 (Collection): TableDefs、Fields和Indexes 。每一个集合都是由若干个对象组成的,这些数据对象的集合可以完全看作是一个数组,并按数组的方法来调用。一旦数据库对象建立后,就可以用它对数据库的结构进行修改和数据处理。对于非Access数据库,大部分都是对应于一个目 录,所以可以使用VB的MkDir语句先生成一个目录,亦即新建一个数据库。而每一个非 Access数据库文件可看作是此目录下的一个数据表(Table),但实际上它们是互相独立的。 下面是新建一个FoxPro 2.5格式数据库的程序实例。 Sub CreateNew ( ) Dim Db1 As database , Td As TableDefs Dim T1 As New Tabledef , F1 As New Field , F2 As New Field , F3 As New Field Dim Ix1 As New Index Dim Path As String Const DB_TEXT = 10 , DB_INTEGER = 3 ChDir "\" Path$ = InputBox( " 请输入新路径名: ", "输入对话框" ) MkDir Path$ ' 新建一个子目录Set Db1 = OpenDatabase(Path$, True, False, "FoxPro 2.5;") Set Td = Db1.TableDefs T1.Name ="MyDB" '新建一个数据表,数据表名为MyDB F1.Name = "Name" , F1.Type = DB_TEXT , F1.Size = 20 F2.Name = "Class" , F2.Type = DB_TEXT , F2.Size = 20 F3.Name = "Grade" , F3.Type = DB_INTEGER T1.Fields.Append F1 '向数据表中添加这些字段T1.Fields.Append F2。

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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