Delphi 调用Sql Sever6.5 存储过程的问题(100分)

  • 主题发起人 主题发起人 dugk
  • 开始时间 开始时间
D

dugk

Unregistered / Unconfirmed
GUEST, unregistred user!
存储过程 是从表1(test)取出所有记录,插入表2(test1) 中 test test1
表结构一样
create procedure newtest As
declare @i int,
@j int
declare
mycursor cursor for
select * from test
open mycursor
fetch mycursor into @i,@j
while (@@fetch_status=0)
begin
insert into test1
values(@i,@j)
fetch mycursor into @i,@j
end
用delphi 的TStoredProc 控件 执行该存储过程,
StoredProc1.ExecProc;
总是非正常退出存储过程 只拷了一部分记录(几十条)test 中有上千条
记录。连Close 游标和 deallocate 游标也没有执行
将存储过程,表换到oracle 下 则没有出现类似问题。
如果存储过程中没有游标,也不会出错。可我的程序
HelpMe
 
你确定test和test1只有两个字段, 并且都是int吗??
 
你如果只是为了这个例子的话,可以这样在吗,肯定比你的快!
insert into to test1 (field1,field2)
select field1,field2 from test
 
to hntangwei 对不起,我没有说清楚,这只是我为了解释问题作的一个模型,
我知道上述做法,可以插入记录,但我的程序必须用一个cursor 问题的关键在
于如果存储过程中有cursor 则在使用cursor 所得的数据集时,总是没有用完
数据集的记录就非正常退出存储过程,连cursor 也没有关闭。
 
还是原码与数据结构post上来吧:-)
 
原码较多,化简后肯定是这个模型
表 test test1 都只有两个字段 并都是int 型
存储过程 见上面
sql server 是6.5
delphi 5
system winnt 4 + sp4
Delphi 程序中
StoredProc1 是TStoredProc 的一个对象
属性栏中填写:
StoredProc1.DateBaseName="DbName"
StoredProc1.StroedProcname="mytest"
并在一个Button 的 Click 事件中有如下代码:
StoredProc1.ExecProce;

 
fetch mycursor into @i,@j
>while (@@fetch_status=0) 改成
WHILE @@fetch_status >=0
begin
insert into test1
values(@i,@j)
fetch mycursor into @i,@j
end

 
将 >while (@@fetch_status=0) 改成
WHILE @@fetch_status >=0

还是不行,结果给以前相同
 
fetch mycursor into @i,@j
改成
FETCH NEXT FROM mycursor INTO @i,@j
 

insert into test1 values(@i,@j)
> fetch mycursor into @i,@j
改成
FETCH NEXT FROM mycursor INTO @i,@j
还有会不会在insert时出错,造成中途退出?
 
呵呵, 知道了, 把第二个fetch mycursor into @i,@j改成fetch mycursor into
就可以了:-)
 
我想并不是存储过程的错误,因为在 ISQL_w 下执行改过程并不会出错
,能把test中的全部记录插入test1中,但用Delphi 调用该存储过程
时,就出错。症状: test 中有2000 条记录,但只插入120条左右的记
录就返回,再调用,就出错,说上次的游标 mycursor 还没有关闭。
 
啊, 看来是这个问题, delphi执行sp的时间长, 所以timeout了. 把database的
timeout时间设长, tstoreproc的时间... 实在不行用tquery来执行.
 
请大家继续回答,否则我将在3天后结束本问。。。
 
为什么非得用cursor?
 
declare
mycursor cursor for
select * from test for update
open mycursor
while 1=1
begin
fetch next from mycursor into @i,@j
if @@fetch_status<>0 break
insert into test1
values(@i,@j)
end
 
Delphi中的存储过程控件Bug甚多
你不如将执行存储过程的语句放到一个Query中去执行
看是不是会好点

还有,如果你在存储过程中使用了两个或两个以上的Select语句
用存储过程控件的Open方法会出错,
出很奇怪的错
 
我也遇到过
环境:D3+NT4+SYBASE11.0.1
当时的解决方法:调用一个批处理,在批处理中执行isql script,script中写exec store proc
可恨的是,一个月之后此问题不存在了
sorry,havn`t time to write
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
875
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部