delhpi用存储过程(返回参数的)怎么回事?
我的存储过程:
CREATE PROCEDURE proGetNewId
@FldKey varchar(20),
@NewId varchar(18) OUTPUT
AS
declare @AutoID as bigint
begin transaction
select @AutoID =(nowId) + 1 from sysmaxid with(updlock) where fldKey = @FldKey
--取出来最大加上一
update sysmaxid set nowid = @AutoID where fldKey = @FldKey
select @NewId = cast(@AutoID as varchar(18))
commit transaction
Go
调用:
// 获取记录号***************
function gFunGetNewId(fld:string):string;
var
adoPro:TADOStoredProc;
strNewId :string;
begin
if adoPro = nil then adoPro:= TADOStoredProc.create(nil);
adoPro.Connection :=gADOCn; //在这报错啊,为什么?
adoPro.ProcedureName := 'proGetNewId;1' ;
adoPro.Parameters.Refresh ;
adoPro.Parameters.parambyname('@FldKey').value:= fld;
adoPro.Parameters.parambyname('@NewId').value :='';
adoPro.open;
showmessage(adoPro.Parameters.parambyname('@NewId').value);
result:= adoPro.Parameters.parambyname('@NewId').value;
end;
请大家看看那里有问题啊
问题点数:20、回复次数:11Top
1 楼Corn1(玉米)回复于 2006-03-06 09:48:12 得分 4
gADOCn是什么?有没有引用定义它的单元?
proGetNewID;1,后面的1是什么意思?存储过程名称是这个?
showMessage,result这两句也有错,返回参数不能这样调用,要到数据集里去取。Top
2 楼cjianwen(空前)回复于 2006-03-06 10:02:01 得分 4
function gFunGetNewId(fld:string):string;
var
qr:TAdoquery;
begin
result:='';
qr:=TAdoquery.create(nil);
try
qr.connection:=anAdoconnection;//一个连接
with qr do
begin
close;
sql.clear;
sql.add('exec proGetNewId :p1,:p2');
parameters[0].asString:=fld;
execsql;
end;
result:=qr.parameters[1].AsString;
finally
qr.free;
end;
用这个试试,没测试过,不知道行不行!Top
3 楼aderly(冬冬)回复于 2006-03-06 10:35:24 得分 4
with ADOStoredProc1.Parameters.AddParameter do
begin
Name:='out3';
DataType:=ftString;
Direction:=pdOutput;
Size:=100;
end;
ADOStoredProc1.Prepared:=true;
ADOStoredProc1.ExecProc;Top
4 楼NewQger(Q哥)回复于 2006-03-06 13:59:37 得分 0
to 玉米: gADOCn是个全局的连接,已经连上单元已经引用,proGetNewID;1 是我看别人还有ADOStoredProc 上有这个,当然我也测试过 没有;1 的.后边的参数引用对不对不清楚,但是在adoPro.Connection :=gADOCn; 这个地方报错的.
to 空前:用ADOQuery已经测试通过.但是 我的连接gADOCn是在另一单元创建的,而我在 本单元使用gADOCn时,报错.但我用另一单元的 查询函数没问题,还是 aQur.connection :=gADOCn;报错.
这个gADOCn连接我在窗体单元里使用没问题.
下边是我的直接定义ADOQuery设其连接为gADOCn代码:
// 获取记录号***************
function gFunGetNewId(fld:string):string;
var
adoPro:TADOQuery;
adoQurNewId:TadoQuery;
strNewId :string;
begin
if adoQurNewId = nil then adoQurNewId.Create(nil);
adoQurNewId.Connection := gADOCn; //就在这里报错???????????????????
result:= '0000123';
end;
Top
5 楼NewQger(Q哥)回复于 2006-03-06 14:03:06 得分 0
但我这样用就可以:
// 获取记录号***************
function gFunGetNewId(fld:string):string;
var
adoPro:TADOQuery;
adoQurNewId:TadoQuery;
strNewId :string;
begin
if adoPro = nil then adoPro:= TADOQuery.Create(nil);
adoPro:= gFunSearchData(' exec pGetNewId ' + fld + ' ',10) ;
strNewId:= adoPro.FieldValues['aNewId'];
result:=strNewId;
end;
//gFunSearchData函数是在定义gADOCn连接的那个单元的代码如下:
{** 公用查询,传SQL语句后执行 返回 Query ****}
function gFunSearchdata(sql:string;intOut:Integer):TADOQuery;
var
aQuery :TADOQuery;
begin
aQuery:=TADOQuery.Create(nil);
aQuery.Connection := gADOCn;
aQuery.SQL.text := sql;
aQuery.CommandTimeout := intOut;
aQuery.Open;
result:=aQuery;
end;Top
6 楼wjowner(Jerry.W)回复于 2006-03-06 14:05:39 得分 4
你的gADOCn是不是定义在对象里面的?如果是,你要用:实例名.gADOCn来引用它(如Form1.gADOCn)Top
7 楼NewQger(Q哥)回复于 2006-03-06 14:05:49 得分 0
当然我把存储过程改成不带返回参数,但是返回结果集是 select Cast(@newId as varchar(18)) as aNewIdTop
8 楼NewQger(Q哥)回复于 2006-03-06 14:07:29 得分 0
不是对象里,而是一个公用单元,上边已经说过,这个连接在窗体单元里用没问题.Top
9 楼whbo(王红波(年轻人,要有所作为))回复于 2006-03-06 14:10:19 得分 4
var intID :integer;
................
adoPro.Parameters.parambyname('@NewId').direction:=pdoutput;
adoPro.Parameters.parambyname('@NewId').value :=intID;
adoPro.execute;
intID:=adoPro.Parameters.parambyname('@NewId').value;
result:= adoPro.Parameters.parambyname('@NewId').value;
Top
10 楼bluekitty(软件黑领)回复于 2006-03-06 14:11:14 得分 0
gADOCn是全局对象么?如果不是就按wjowner(Jerry.W) 的改Top
11 楼NewQger(Q哥)回复于 2006-03-06 14:19:57 得分 0
连接所在那个单元的头部分是这样的,难道全局变量要加public???
unit UGdb;
interface
uses SysUtils,Db,AdoDb;
function gFunConnect():Boolean; // 连接数据库
function gFunSearchdata(sql:string;intOut:Integer):TADOQuery; //通用查询
var
gADOCn :TADOConnection; //公用全局连接
implementation
......Top




