hur.cn - 华软网

 热门搜索

pb中调用sql server 的一个存储过程后一个表被锁住的问题?

  作者:未知    来源:网络    更新时间:2017/12/5
pb中调用sql server  的一个存储过程sp_lxe,这个存储过程把取得的结果集放到另一个数据库的一个表lxe中,然后在pb中再用datawindow从这个表中读取数据时长时间等待,好像被锁死的样子。

此存储过程如下:

ALTER    procedure sp_lxe
@month varchar(20)
as
begin

  declare @sql varchar(5000)  /* 存放要执行的查询sql语句 */
  declare @table varchar(20)  /* 存放表名 */
  
  create table  #jszgs (name varchar(20)) /* 创建本地临时表#jszgs */

  /* 从系统表中搜索符合条件的要查询的表名,并把它们放进临时表#jszgs中 */
  exec ('insert into #jszgs select name from sysobjects where xtype=''u'' and name like  '+''''+@month+'%'+'''' )

  /* 用游标从临时表中取出取出要查询的表名 */
  declare cursor_table cursor for select name from #jszgs

  open cursor_table

  /* 根据表名生成相应的sql语句并把它们的结果集合并起来 */
  fetch next from cursor_table into @table
  if @@FETCH_STATUS = 0 
  begin
     set @sql='select yhf,cm,lxe from '+@table

     fetch next from cursor_table into @table 

     while @@FETCH_STATUS = 0
     begin
        set @sql=@sql+' union all '+'select yhf,cm,lxe from '+@table

        fetch next from cursor_table into @table
     end
   
  end

  close cursor_table 

  drop table #jszgs

  deallocate cursor_table


  /* 清空lxe表 */
  truncate table  cost_balance.dbo.lxe 

  /* 把结果集插进lxe表 */
  exec ('insert into cost_balance.dbo.lxe (yhf,cm,lxe) '+ @sql)

end


在pb中调用如下:

string ls_month
datastore lds_yhf
string ls_yhf[]
int i

if not isdate(em_month.text+'-01') then 
   messagebox("警告","请输入正确月份",stopsign!)
return
end if

SetPointer(HourGlass!)
ls_month="jszgs"+left(em_month.text,4)+right(em_month.text,2)

DECLARE proc_lxe PROCEDURE FOR dbo.sp_lxe
@month=:ls_month using gtr_newcoal;

EXECUTE proc_lxe;
close proc_lxe;

if rb_all.checked then
   lds_yhf=create datastore
lds_yhf.dataobject="d_coal_cost_lxe_sc"
lds_yhf.settransobject(gtr_cost)
lds_yhf.retrieve()

for i=1 to lds_yhf.rowcount() 
    ls_yhf[i]=string(lds_yhf.object.yhf[i])
   next
else
ls_yhf[1]=sle_no.text

end if

dw_1.retrieve(ls_yhf[])//此处死机

destroy lds_yhf

------华软网友回答------
关注 + 友情UP
------华软网友回复------
老兄,这样做是有问题的阿,你的存储过程在库A里,然后你从库B里检索数据,你的dw和procedure却是用的同一个连接。
------华软网友回复------
用的是两个事务对象,这里忘了说了:

Transcation gtr_cost
Transcation gtr_newcoal

dw_1.setransobject(gtr_cost)//在窗口open事件里

procedure 用gtr_newcoal




------华软网友回复------
关注
------华软网友回复------
问题解决了,一个很基本的问题。
就是这样:

...

ls_month="jszgs"+left(em_month.text,4)+right(em_month.text,2)
DECLARE proc_lxe PROCEDURE FOR dbo.sp_lxe
@month=:ls_month using gtr_newcoal;

gtr_newcoal.aotocommit=true //加这句,把事务对象设为自动提交事务

EXECUTE proc_lxe;
close proc_lxe;

gtr_newcoal.aotocommit=false  //加这句,恢复原来设置

...


要把事务提交掉,不然进程会一直等待提交事务,当然会锁住表了。

感谢大家回答,开始放分了!!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。