事务滚回的问题

wangxianzhi 2003-10-16 01:20:08
我有一个保存事件
Private Sub cmdsave_Click()
On Error GoTo ERR:
c_CON.db.BeginTrans'开始事务
for i=1 to 10
'插入入库记录的代码
( 略)
'在这里我有一个全局过程
Call UpdateYmjy(100,150)

next
c_CON.db.CommitTrans '提交事务

ERR:
c_CON.db.RollbackTrans
MsgBox "发生错误,调价不成功 " & Ssql & "", vbCritical

end sub

Public Sub UpdateYmjy(sl As Double, je As Double)
Dim Wsl As ADODB.Parameter
Dim Wje As ADODB.Parameter
Dim Mycommand As New ADODB.Command
Mycommand.ActiveConnection = c_CON.db.Connect '对象的连接字符串和上面是一样的即也是 c_con的连接字符串

Set Wsl = New ADODB.Parameter
Wsl.Type = adDouble
Wsl.Value = sl
Mycommand.Parameters.Append Wsl

Set Wje = New ADODB.Parameter
Wje.Type = adDouble
Wje.Value = je
Mycommand.Parameters.Append Wje

Mycommand.CommandText = "gxymjyb"‘存储过程
Mycommand.CommandType = adCmdStoredProc
Dim ree As New ADODB.Recordset
Set ree = Mycommand.Execute()
end sub

我想请教的问题是:如果错误发生的滚回c_con对象倒是容易,但Mycommand
怎么滚回呢!(mycommand 是在过程内 是不是也可以定义成一个全局的对象叱!)
...全文
31 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxianzhi 2003-10-16
  • 打赏
  • 举报
回复
搞定了是参数的长度没指定


wsl.size=20
davidlv 2003-10-16
  • 打赏
  • 举报
回复
那你再试一下adVarChar或adVariant,我也奇怪为什么会这样呢??奇怪??
wangxianzhi 2003-10-16
  • 打赏
  • 举报
回复
都不行,真是怪了改用
Mycommand.ActiveConnection = c_CON.db.Connect 就一切OK

不过今天真是谢你了担误你工作!
davidlv 2003-10-16
  • 打赏
  • 举报
回复
我没有QQ,只有MSN:yongliang_lv@msn.com
davidlv 2003-10-16
  • 打赏
  • 举报
回复
你改用adChar试一下
wangxianzhi 2003-10-16
  • 打赏
  • 举报
回复
我的QQ185445901 要不咱到这里来聊聊吧!
wangxianzhi 2003-10-16
  • 打赏
  • 举报
回复
Set Ws_ph = New ADODB.Parameter
Ws_ph.Type = adBSTR
Ws_ph.Value = s_ph
Mycommand.Parameters.Append Ws_ph

我讲错了, 是不是
Ws_ph.Type = adBSTR 这个个类型有问题呢!
今天真是不好意思明天晚上就要转到 db2 里去急死人呀再不行真只有把它们写到程序里了唉!
这是一个更新药品月未结余信息的存储过程!

CREATE Procedure gxymjyb
@Month char(4),
@s_type char(10),
@dept int,
@HH CHAR(20),
@PH CHAR(50),
@n_sl float,
@n_je float
as
declare @sl_Filed char(20)
declare @je_Filed char(20)
declare @ssql char(1000)
declare @recordcount int
declare @s_yplx char(30)
declare @s_hh char(20)
declare @s_ph char(50)

set @s_hh=''''+rtrim(convert(nvarchar,@hh))+''''
set @s_ph=''''+rtrim(convert(nvarchar,@ph))+''''

if left(@hh,2)='XY'
set @s_yplx='西药'
if left(@hh,2)='CY'
set @s_yplx='中成药'
if left(@hh,2)='ZY'
set @s_yplx='中草药'

--set @month=MONTH(GETDATE())
set @sl_filed='n_'+rtrim(convert(varchar,@month))+rtrim(convert(varchar,@s_type))+'s'
set @je_filed='n_'+rtrim(convert(varchar,@month))+rtrim(convert(varchar,@s_type))+'je'

select @recordcount =count(*) from yk_ymjy where rtrim(s_hh) =rtrim(@hh) and isnull(rtrim(s_ph),'')=convert(nvarchar,rtrim(@ph)) and n_year=convert(nvarchar,year(getdate())) and deptid=@dept
print @recordcount

if isnull(@recordcount,0)>0
begin
set @ssql=' update yk_ymjy set '+ convert(varchar,@sl_filed)+'=isnull('+convert(varchar,@sl_filed)+',0)+('+convert(varchar,@n_sl)+'),'+convert(varchar,@je_filed)+'= isnull('+convert(varchar,@je_filed)+',0)+('+convert(varchar,@n_je)+') where s_hh='+convert(varchar,@s_hh)+' and isnull(s_ph,'''')='+RTRIM(@s_ph)+' and n_year='+convert(varchar,year(getdate())) +' and deptid='+convert(varchar,@dept)
exec(@ssql)
print @ssql
end
if isnull(@recordcount,0)=0
begin
insert into yk_ymjy(deptid,s_hh,s_yplx,s_ph,n_year) values(@dept,@hh,@s_yplx,@ph,year(getdate()))
set @ssql=' update yk_ymjy set '+ convert(varchar,rtrim(@sl_filed))+'= isnull('+convert(varchar,rtrim(@sl_filed))+',0)+('+convert(varchar,rtrim(@n_sl))+'),'+convert(varchar,rtrim(@je_filed))+'= isnull('+isnull(convert(varchar,rtrim(@je_filed)),0)+',0)+('+convert(varchar,rtrim(@n_je))+') where id='+CONVERT(VARCHAR,SCOPE_IDENTITY())
exec(@ssql)
print @ssql
end
GO
davidlv 2003-10-16
  • 打赏
  • 举报
回复
这个与mycommand.type没有关系,这个变量是用于识别你传的Mycommand.CommandText = "gxymjyb"是个什么东西,参数为adCmdStoredProc说明“gxymjyb”是个存储过程,这个一时倒不清楚。你看一下存储过程中的内容是什么,从道理上讲应该不会这样的,
wangxianzhi 2003-10-16
  • 打赏
  • 举报
回复
不传的时候是这样的如: s_hh(货号) 值为 xy0020
如果传对象的话就是如: s_hh(货号) 值为 x

所有字符型字段都是这样数值型正常 我跟踪SQL 模板 看到的结果是:
exec gxymjyb N' ', N'N', 258, N'X', N'无', 1.000000000000000e+001, 1.670000000000000e+002

应该是:
exec gxymjyb N' ', N'Nc', 258, N'Xy0020', N'无批号', 1.000000000000000e+001, 1.670000000000000e+002

明白了吗前面那句明显只取了最前一位的字符串你说是不是和 mycommand.type 这个变量的类型
定义有关???
davidlv 2003-10-16
  • 打赏
  • 举报
回复
Dim Mycommand As New ADODB.Command
改成Dim Mycommand As ADODB.Command这个地方我说错了,你还是用Dim Mycommand As New ADODB.Command
davidlv 2003-10-16
  • 打赏
  • 举报
回复
你再说清楚一些,把内容写出来,应该是什么样子的,现在成了什么样子?我是指字段的内容
wangxianzhi 2003-10-16
  • 打赏
  • 举报
回复
行,但遇到了一个新问题:
不传Vcnn时我的记录正常(如插入了一条新的记录,)但是用了之后我发现插入的新记录
的字符串fields 只取了最前一个字符串怪事!
davidlv 2003-10-16
  • 打赏
  • 举报
回复
我试过Mycommand.ActiveConnection = vcnn'没有问题呀
davidlv 2003-10-16
  • 打赏
  • 举报
回复
Dim Mycommand As New ADODB.Command
改成Dim Mycommand As ADODB.Command
davidlv 2003-10-16
  • 打赏
  • 举报
回复
Public Sub UpdateYmjy(byval vCnn as adodb.connection, sl As Double, je As Double)
Dim Wsl As ADODB.Parameter
Dim Wje As ADODB.Parameter
Dim Mycommand As New ADODB.Command

Mycommand.ActiveConnection = vcnn'这样不行吗


Set Wsl = New ADODB.Parameter
Wsl.Type = adDouble
Wsl.Value = sl
Mycommand.Parameters.Append Wsl

Set Wje = New ADODB.Parameter
Wje.Type = adDouble
Wje.Value = je
Mycommand.Parameters.Append Wje

Mycommand.CommandText = "gxymjyb"‘存储过程
Mycommand.CommandType = adCmdStoredProc
Dim ree As New ADODB.Recordset
Set ree = Mycommand.Execute()
end sub
wangxianzhi 2003-10-16
  • 打赏
  • 举报
回复
不行,程序报错说是不可接受的类型
可能
Mycommand.ActiveConnection = vCnn 根本就不是同一个类型
wangxianzhi 2003-10-16
  • 打赏
  • 举报
回复
我在试
davidlv 2003-10-16
  • 打赏
  • 举报
回复
Mycommand.ActiveConnection = c_CON.db.Connect '对象的连接字符串和上面是一样的即也是 c_con的连接字符串

你改成Mycommand.ActiveConnection = vCnn(传进来的),你再试一下
davidlv 2003-10-16
  • 打赏
  • 举报
回复
我以前用过DB2,但不用存储过程,只是为了灵活能够控制,尤其是事务,我知道你的意思,我想一下。
davidlv 2003-10-16
  • 打赏
  • 举报
回复
如果你要把所有在A中操作的事务全部回滚,你在B中就不能有事务
加载更多回复(5)

1,216

社区成员

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

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