调用存储过程后就不能update表了(100分)

  • 主题发起人 主题发起人 hehu
  • 开始时间 开始时间
H

hehu

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库是SQL Server 6.5,我在Delphi中调用了存储过程,是select A表,经过处理后insert into B表。然后再用A、B表的时候,update 就一直在那里等待....而我直接在SQL Server上 execute sp,然后update..就可以的。
各位帮帮我啊,受不了了...
调用存储过程:
storedproc1.Prepare;
storedproc1.ExecProc;
storedproc1.Unprepare;
 
在存储过程处理完毕,如果成功,则Commit Trans,如果失败则RollBack Trans;
这样你就释放了琐。
 
我的存储过程是处理完毕的呀,请说详细些好吗???
 
存储过程中在处理完毕有没有Commit Transaction???
 
我没有使用transcation啊....要用的话,怎么做呢?
 
我以前也遇到过类似问题
请检查存储过程中是否有多于一个的Select语句
BDE处理这种情况好象会出问题
建议用ODBC或ADO
 
能不能将你的存储过程代码贴出来?
 
wrench:
天哪,不会让我改用ODBC吧,这是个庞大的程序啊,难道没有别的解决办法了吗??
我的存储过程中有无数个select @sd=asdfadf 和一个select * from table.

 
if exists (select * from sysobjects where id = object_id('dbo.clkcyg') and sysstat & 0xf = 4)
drop procedure dbo.clkcyg
GO

CREATE PROCEDURE clkcyg AS

declare @xkbh char(4)
declare @kcdm char(7)
declare @jxbh int
declare @yxlb varchar(55)
declare @nj char(4)
declare @nj1 char(4)
declare @rs int
declare @yzbz tinyint
declare @x varchar(2)
declare @yxlb1 varchar(16)
declare @yxlb2 varchar(50)
declare @ws char(2)
declare @bj int
declare cs1 SCROLL cursor for
select xkbh,kcdm,jxbh,yxlb,nj,rs,x from kcyg order by xkbh
open cs1
truncate table kb_yz
fetch next from cs1 into @xkbh,@kcdm,@jxbh,@yxlb,@nj,@rs,@x
while @@FETCH_STATUS<>-1
begin
if @x='选'
select @yzbz=0
else
select @yzbz=1
select @nj1=ltrim(rtrim(@nj))
select @bj=NULL
......(省略了一些判断语句)
insert into kb_yz (xkbh,kcdm,jxbh,yxlb,nj,rs,x,yzbz,bh) values(@xkbh,@kcdm,@jxbh,@yxlb1,@nj1,@rs,@x,@yzbz,@bj)


fetch next from cs1 into @xkbh,@kcdm,@jxbh,@yxlb,@nj,@rs,@x
end
close cs1
DEALLOCATE cs1
GO
 
这样试试!

if exists (select * from sysobjects where id = object_id('dbo.clkcyg') and sysstat &amp; 0xf = 4)
drop procedure dbo.clkcyg
GO

CREATE PROCEDURE clkcyg AS

declare @xkbh char(4)
declare @kcdm char(7)
declare @jxbh int
declare @yxlb varchar(55)
declare @nj char(4)
declare @nj1 char(4)
declare @rs int
declare @yzbz tinyint
declare @x varchar(2)
declare @yxlb1 varchar(16)
declare @yxlb2 varchar(50)
declare @ws char(2)
declare @bj int
declare cs1 SCROLL cursor for
select xkbh,kcdm,jxbh,yxlb,nj,rs,x from kcyg order by xkbh

begin tran /***添加****/
open cs1
truncate table kb_yz
fetch next from cs1 into @xkbh,@kcdm,@jxbh,@yxlb,@nj,@rs,@x
while @@FETCH_STATUS<>-1
begin
if @x='选'
select @yzbz=0
else
select @yzbz=1
select @nj1=ltrim(rtrim(@nj))
select @bj=NULL
......(省略了一些判断语句)
insert into kb_yz (xkbh,kcdm,jxbh,yxlb,nj,rs,x,yzbz,bh) values(@xkbh,@kcdm,@jxbh,@yxlb1,@nj1,@rs,@x,@yzbz,@bj)


fetch next from cs1 into @xkbh,@kcdm,@jxbh,@yxlb,@nj,@rs,@x
end
close cs1
DEALLOCATE cs1
commit trans /***添加****/

GO

 
我加了事务处理,可问题依旧啊...:(((
 
在调用存储过程你试试将A,B两表Active:=False ,Active:=True后再Update.
 
procedure Tclkcyg.Button1Click(Sender: TObject);
begin
table1.active:=false;
table2.acitve:=false;
storedproc1.Prepare;
storedproc1.ExecProc;
storedproc1.Unprepare;
button2.Visible:=True;
table2.active:=false;
table1.active:=false;
table1.active:=True;
table2.active:=True;
dbgrid2.visible:=True;
DBnavigator1.Visible:=True;
button1.enabled:=False;
end;

talbe1和table2对应A、B表,dbgrid2、dbnavigator1对应B表
可还是不行啊.....
多谢“沈前卫”了....
 
你等一等,我在Oracle下试试!
 
我使用oracle8+delphi5。

table a :(a1,a2 :number(10,2)) table b(a1,a2:number(10,2))

存储过程为:

CREATE procedure testproc
as
cursor test_cursor is
select a1,a2 from a;
begin
for v_a in test_cursor loop
insert into b values(v_a.a1+v_a.a2,v_a.a1-v_a.a2);
end loop;
end;

先执行存储过程,再用Query执行update b set a1=1000; 得到结果正常.


 
上面wrench说如果存储过程多于1个会出问题,你加两个 select @df=asdf
再试试看还行不行????
 
我不明白你的意思。说清楚点。

btw:
Ms sql下存储过程允许使用truncate table kb_yz,oracle下好象不行,要使用
dbms_sql.
 
我的意思是你在你的存储过程中加几句select 语句,比如
begin
for v_a in test_cursor loop
select @add=v_a.a1+v_a.a2;
select @min=v_a.a1-v_a.a2;
//其实就是赋值语句;
insert into b values(v_a.a1+v_a.a2,v_a.a1-v_a.a2);
改成 insert into b values(@add,@min);
end loop;
end;
(不知道Oracle里的赋值语句是不是也写成select的形式。)
sql server 用transcation的话也不允许truncate table,我改用delete了
 
赋值时不要用Select赋值,
用Set
BDE中,Select会向客户端返回的说
 
to hehu:
我用的史Oracle,不是ms sql.
下面的还是没问题。这样把,你自己把你过程先由简单到复杂,依次试试,看看什么
地方出问题。我估计是你的Delphi程序有问题。

CREATE procedure testproc
as
aa1 number(10,2);
aa2 number(10,2);
cursor test_cursor is
select a1,a2 from a;
begin
select a1,a2 into aa1,aa2
from a
where rownum<2;
select a1,a2 into aa1,aa2
from a
where rownum<2;
for v_a in test_cursor loop
insert into b values(v_a.a1+v_a.a2,v_a.a1-v_a.a2);
end loop;
select a1,a2 into aa1,aa2
from a
where rownum<2;
select a1,a2 into aa1,aa2
from a
where rownum<2;
end;

//我要睡觉了,明天再来看看
 

Similar threads

后退
顶部