function TTest.test(varT: OleVariant): OleVariant;
Var
adoCnn : Connection;
adoCmd : Command;
adoPrm_t : Parameter;
adoPrm_IDType : Parameter;
adoPrm_MaxID : Parameter;
sRet : String;
bln_OpenCnn : Boolean;
bln_OpenTran : Boolean;
Begin
Try outputDebugString(PChar('A0001:' + vartostr(varT))); bln_OpenTran := false;
bln_OpenCnn := false; // 打开数据库连接
adoCnn := CoConnection.Create;
adoCnn.ConnectionTimeout := 180;
adoCnn.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=gxjj;Password=a;Initial Catalog=gxjj;Data Source=ENJSKY';
adoCnn.CursorLocation := adUseClient;
adoCnn.IsolationLevel := adXactReadCommitted;
adoCnn.Open('', '', '', 0);
bln_OpenCnn := True; // 开始事务
adoCnn.BeginTrans;
bln_OpenTran := True; adoCmd := CoCommand.Create;
adoCmd.CommandText := 'pMaxID_A';
adoCmd.CommandType := adCmdStoredProc;
adoPrm_t := adoCmd.CreateParameter('@t', adWChar, adParamInput, 1, '');
adoCmd.Parameters.Append(adoPrm_t); // 设置参数 strIDTpye
adoPrm_IDType := adoCmd.CreateParameter('@strIDType', adWChar, adParamInput, 6, '000002');
adoCmd.Parameters.Append(adoPrm_IDType); // 设置参数 strMaxID
adoPrm_MaxID := adoCmd.CreateParameter('@strMaxID', adVarWChar, adParamOutput, 255, '');
adoCmd.Parameters.Append(adoPrm_MaxID); // 执行保存的存储过程
adoCmd._Set_ActiveConnection(adoCnn);
adoCmd.Execute(EmptyParam, EmptyParam, adCmdStoredProc); // 获得最大编号返回值
sRet := adoPrm_MaxID.Value; outputDebugString(PChar('A0001:' + vartostr(sRet))); result := sRet; // 提交变化
adoCnn.CommitTrans;
bln_OpenTran := False; adoPrm_t := Nil;
adoPrm_IDType := Nil;
adoPrm_MaxID := Nil;
adoCmd := Nil;
adoCnn.Close;
adoCnn := Nil; Except
On e: Exception Do
Begin
result := e.Message;
If (bln_OpenTran=True) Then
Begin
adoCnn.RollbackTrans;
adoPrm_t := Nil;
adoPrm_IDType := Nil;
adoPrm_MaxID := Nil;
adoCmd := Nil;
End; If (bln_OpenCnn=True) Then adoCnn.Close; adoCnn := Nil; End;
End;
End;
这个是源码
请高手赐教,解决马上给分,在线等待
操作oracle没有问题,测试通过了
Var
adoCnn : Connection;
adoCmd : Command;
adoPrm_t : Parameter;
adoPrm_IDType : Parameter;
adoPrm_MaxID : Parameter;
sRet : String;
bln_OpenCnn : Boolean;
bln_OpenTran : Boolean;
Begin
Try outputDebugString(PChar('A0001:' + vartostr(varT))); bln_OpenTran := false;
bln_OpenCnn := false; // 打开数据库连接
adoCnn := CoConnection.Create;
adoCnn.ConnectionTimeout := 180;
adoCnn.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=gxjj;Password=a;Initial Catalog=gxjj;Data Source=ENJSKY';
adoCnn.CursorLocation := adUseClient;
adoCnn.IsolationLevel := adXactReadCommitted;
adoCnn.Open('', '', '', 0);
bln_OpenCnn := True; // 开始事务
adoCnn.BeginTrans;
bln_OpenTran := True; adoCmd := CoCommand.Create;
adoCmd.CommandText := 'pMaxID_A';
adoCmd.CommandType := adCmdStoredProc;
adoPrm_t := adoCmd.CreateParameter('@t', adWChar, adParamInput, 1, '');
adoCmd.Parameters.Append(adoPrm_t); // 设置参数 strIDTpye
adoPrm_IDType := adoCmd.CreateParameter('@strIDType', adWChar, adParamInput, 6, '000002');
adoCmd.Parameters.Append(adoPrm_IDType); // 设置参数 strMaxID
adoPrm_MaxID := adoCmd.CreateParameter('@strMaxID', adVarWChar, adParamOutput, 255, '');
adoCmd.Parameters.Append(adoPrm_MaxID); // 执行保存的存储过程
adoCmd._Set_ActiveConnection(adoCnn);
adoCmd.Execute(EmptyParam, EmptyParam, adCmdStoredProc); // 获得最大编号返回值
sRet := adoPrm_MaxID.Value; outputDebugString(PChar('A0001:' + vartostr(sRet))); result := sRet; // 提交变化
adoCnn.CommitTrans;
bln_OpenTran := False; adoPrm_t := Nil;
adoPrm_IDType := Nil;
adoPrm_MaxID := Nil;
adoCmd := Nil;
adoCnn.Close;
adoCnn := Nil; Except
On e: Exception Do
Begin
result := e.Message;
If (bln_OpenTran=True) Then
Begin
adoCnn.RollbackTrans;
adoPrm_t := Nil;
adoPrm_IDType := Nil;
adoPrm_MaxID := Nil;
adoCmd := Nil;
End; If (bln_OpenCnn=True) Then adoCnn.Close; adoCnn := Nil; End;
End;
End;
这个是源码
请高手赐教,解决马上给分,在线等待
操作oracle没有问题,测试通过了
解决方案 »
- 看看下面的代码
- 英语背单词的开发思路
- 我用combobox控件定义了一个下拉列表框,怎样把列表框中的那些选项与一个数组对应起来呢?
- ★★★★求日期函数 类似于Sql中的DATEADD
- 散分,新年到,新年到,祝大家新年好。
- 别人给了我上百分,为什么我的可用分还是原来的没变!!!
- NT服务程序加了ADO出错,请各位帮忙解决。
- 多个处理器(CPU)硬件上运行的基于Corba DataModule的Midas服务器怎么经常崩溃?
- 采用什么方法可以把TMemoryStream类型的数据存入数据库的Blob类型的字段
- 关于报表的问题__急救!!!
- 求助:怎样将一个EXCEL文件导入到DBGRID里?
- 求助: Access中表数据为何不能更新
不通过
报错 过程pMaxID_A需要参数@strIDType 但未提供该参数adoCmd.CommandText :='{call pMaxID_A(?,?,?)}';现在我改成这样了
又报错:至少一个参数没有指定值
------------------------
1、首先确定连接字符串没问题
2、确定连接
3、确定存储过程名字正确
4、参数的类型、个数要匹配你可以用ADOStoredProc组件试一下。
还不会用,没有用过
GO
SET ANSI_NULLS ON
GO/*-------------------------------------------------
* 存储过程: pMaxID_A
* 作者: Mike
* 功能: 获得一级编号中指定类型的最大编号
* 参数: t 无用的参数
* strIDTpye 一级编号类型
* intSize 该编号需要的长度
* strMaxID (输出)最大一级编号
-------------------------------------------------*/ALTER PROCEDURE pMaxID_A
@strIDType char(6),
@strMaxID varchar(200) out
as
declare @intID numeric(20) -- 最大编号值
declare @intSize numeric(20) -- 最大编号长度
declare @strLoop varchar(1) -- 是否是循环
declare @intMinValue numeric(20) -- 范围.最小编号
declare @intMaxValue numeric(20) -- 范围.最大编号
declare @intExist numeric(20) -- 判断编号是否已经存在set nocount on -- 确定该最大编号类型是否已经存在
SELECT @intExist = COUNT(IDTYPE)
FROM MAXID
WHERE IDTYPE = @strIDType
AND ID1 = '0'
AND ID2 = '0'
-- 获得最大编号类型的长度
SELECT @intSize = IDSIZE,
@strLoop = IDLOOP,
@intMinValue = IDMIN,
@intMaxValue = IDMAX
FROM MAXIDTYPE
WHERE IDTYPE = @strIDType -- 返回错误:最大编号长度定义错误,长度不能为 0
-- 或最大编号范围指定错误
if @intSize=0
goto errSizeError
if @intMinValue<0
set @intMinValue = 0 -- 如果这个最大编号没有使用,则需要重新分配一个最大编号
if @intExist=0
begin
set @intID = @intMinValue
insert into maxid(idtype, id1, id2, maxid) values (@strIDType, '0', '0', @intID);
end
else
begin
-- 从最大编号表中获得最大编号,并锁定该行
SELECT @intID = MAXID
FROM MAXID with (ROWLOCK)
WHERE IDTYPE = @strIDType ;
set @intID = @intID + 1 -- 最大编号加一
-- 校验长度范围
if len(cast(@intID as char))>@intSize
if @strLoop = '1' -- 如果是循环可用的最大编号
set @intID = @intMinValue
else
goto errSizeError -- 返回错误:超出最大编号范围
IF @intID>@intMaxValue and @intMaxValue <> -1
if @strLoop = '1' -- 如果是循环可用的最大编号
set @intID = @intMinValue
else
goto errSizeError -- 返回错误:超出最大编号范围
-- 更新最大编号表
UPDATE MAXID SET MAXID = @intID WHERE IDTYPE = @strIDType AND ID1 = '0' AND ID2 = '0';
end -- 输出最大编号
-- set @strMaxID = LPAD(TO_CHAR(intID), intSize, '0'); set @strMaxID = right('00000000000000000000000000000000'+cast(@intID as varchar(100)),@intSize)if @@error <> 0 GOTO errSizeErrorerrSizeError:
set @strMaxID = -1;set nocount off
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
这个是我的存储过程
你留个邮箱,我把代码也发给你,谢谢哦
向你学习
最好是以 ado 的方式来调用,就我提供的这种
ADOStoredProc1.Parameters.CreateParameter();
ADOStoredProc1.Parameters.ParamByName('').ASXXXX := XXXX;
ADOStoredProc1.Parameters.CreateParameter();
ADOStoredProc1.Parameters.ParamByName('').ASXXXX := XXXX;
ADOStoredProc1.ExecProc;
adoCmd := CoCommand.Create;
adoCmd.CommandText := 'pMaxID_A';
adoCmd.CommandType := adCmdStoredProc; adoCmd.Parameters.Append(adoCmd.CreateParameter('@strMaxID', adVarChar, adParamOutput, 200, '1')); adoCmd.Parameters.Append(adoCmd.CreateParameter('@strIDType', adChar, adParamInput, 6, '000001')); // 执行保存的存储过程
adoCmd._Set_ActiveConnection(adoCnn);
adoCmd.Execute(EmptyParam, EmptyParam, adCmdStoredProc); // 获得最大编号返回值
// strMaxID := adoPrm_t.Value; showMessage(vartostr(adoCmd.Parameters.Item[0].value));存储过程如下:
ALTER PROCEDURE pMaxID_A
@strMaxID varchar(200)='' out,
@strIDType char(6)=''
关键问题:
1,要将 out 参数放在前面
2,要将没一个参数给出一个默认的值,即使是空也要给以上为个人总结