关于使用DBEXPRES存储过程问题(100分)

  • 主题发起人 主题发起人 linghu
  • 开始时间 开始时间
L

linghu

Unregistered / Unconfirmed
GUEST, unregistred user!
我在数据库服务器上写了一个存储过程
create procedure a @value1 int, @value2 int,@value3 int
as
insert into test values(@value1,@value2,@value3)
然后在DELPHI 中写程序调用这个过程.
在delphi中我使用的是DBEXPRESS中的存储过程组件
SP 是存储过程组件
sp.Close;
sp.Params.Clear;
sp.StoredProcName:='a';//在服务器上的过程名就是a
sp.Params.CreateParam(ftinteger,'@test1',ptinput);
sp.Params.CreateParam(ftinteger,'@test2',ptinput);
sp.Params.CreateParam(ftinteger,'@test3',ptinput);

sp.Params.ParamByName('@test1').Value:=strtoint(t1.Text);
sp.Params.ParamByName('@test2').Value:=strtoint(t2.Text);
sp.Params.ParamByName('@test3').Value:=strtoint(t3.Text);

try
sp.ExecProc;
except
begin
Application.MessageBox('执行存储过程失败!','错误信息',MB_OK+MB_ICONERROR);
exit;
end;
sp.Prepared:=true;
sp.ExecProc();
end;
在一个CLICK的事件中写的.
老提示一个出错的信息

"list index out of bound(0)"

不知道怎么回事,想请教一下.谢谢.

zk

06.10.26
 
这个问题基本上是没有答案的,在很多地方都没有解答。
用dbexpress 是可以执行存储过程。至少有几个要求
1。 第一个参数必须是这个
sqlproc.Params.CreateParam(ftInteger, 'RETURN_VALUE', ptOutput );
2。 schemaname 要是 'dbo'
这样做在sqlserver2000下是可以执行存储过程的。
但是还是有问题,当存储过程可以返回数据的时候,通过系统的参数值是没有办法获取数据,测试很多次没有办法,我已经改用了ADO了。
 
问题依旧

现在把所有的细节问题全部写出来,希望能够得到帮助。

1 在sql server 2000 数据库中建立一个数据库AA,然后在建立一个test的表格,语句如下:


CREATE DATABASE aa
ON
(
NAME=aa,
FILENAME='E:/DATABASE/aa.mdf')
LOG ON
(
NAME=aa_LOG,
FILENAME='E:/DATABASE/aa.1DF'
)


CREATE TABLE
test
(
test1 integer,
test2 integer,
test3 integer,
)


然后在建立一个过程,过程是通过得到3个参数的VALUE,插入一条记录,过程名是A
过程如下:
CREATE procedure a @value1 int, @value2 int,@value3 int
as
insert into test values(@value1,@value2,@value3)
GO
在SQL SERVER 2000中,语法没有错误,并能根据输入的参数顺利执行。

下面是程序的设计:
一个 TSQLconnection(简称TCNN)组件,一个TSimpledataset(简称TDST)组件,一个TSQLstoreprocedure(简称SP)

组件。
一个datasource1(简称DSS)组件,3个编辑框分别是T1,T2,T3,接受数值的输入。
一个显示数据的DBGRID(简称DBG)组件。

连接如下:
tcNN组件的属性是通过双击完成设置。主要是数据库的连接和密码的设置。
可以参考此文件的设置:
http://www.delphibbs.com/keylife/iblog_show.asp?xid=4018(某些设置和ORACEL是一样的)

把TDST的SQLCONNECTON连接为TCNN,并在里边写入一个SQL 语句
SELECT * FROM TEST,ACTIVE 设置为TRUE,
把DSS组件的DATASET属性设置为TDST,然后DBG的DATASOURCE属性设置为DS
此时DBG显示的就是数据库TEST的内容。

现在主要的任务就是通过SP组件的参数传递,插入一条记录。
SP组件的设置如下:
sqlconnection属性设置为TCNN,STOREPROCNANE设置为A(不知道为什么不能直接从数据库中获取。JRQ兄写的

Delphi7下用dbExpress调用Oracle存储过程(返回数据集)的一个简单示例和调试过程此文章中关于包的问题,由于 不是

很熟练的使用SQL SERVER ,所以包的概念也不是很清楚。)直接在文本框中输入A,就可以了。


放入一个按扭,在CLICK时间中执行存储过程的语句如下代码:

sp.Close;
sp.Params.Clear;
sp.StoredProcName:='a';//在服务器上的过程名就是a
//sp.SchemaName:='dbo'; b
//我不知道此代码到底为什么要加上,反正是有没有都是会出现错误的。
//sp.Params.CreateParam(ftInteger, 'RETURN_VALUE', ptOutput ); A
//我不知道此代码到底为什么要加上,反正是有没有都是会出现错误的。
sp.Params.CreateParam(ftinteger,'@test1',ptinput);
sp.Params.CreateParam(ftinteger,'@test2',ptinput);
sp.Params.CreateParam(ftinteger,'@test3',ptinput);
//建立三个参数

sp.Params.ParamByName('@test1').Value:=strtoint(t1.Text);
sp.Params.ParamByName('@test2').Value:=strtoint(t2.Text);
sp.Params.ParamByName('@test3').Value:=strtoint(t3.Text);
//获取数据
sp.Prepared:=true;
sp.ExecProc;
//执行过程

如果让A,b处执行, 提示的错误是 LIST INDEX OUT OF bound(4)
如果让A,b处不执行,提示的错误是 LIST INDEX OUT OF bound(4)
在使用ADO中的存储过程中没有发先此错误.


至今还在调试中......
 
用sqlquery控间,sqlquery.sql.text:='exec a :v1,:v2,:v3';
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
950
SUNSTONE的Delphi笔记
S
I
回复
0
查看
826
import
I
后退
顶部