BCB调用存储过程问题
要调用名为bank_patient_info的存储过程函数,
传入参数
住院号@inpatient_novarchar(10)
返回信息@msgvarchar(200) output
如果调用成功,则返回
查询结果
病人IDpatient_idVARCHAR (12)
住院次数admiss_times SMALLINT
……
等。失败则msg返回失败信息。
如何用TADOQuery实现?查了不少帖子,按照帖子的方法,存储过程执行成功后,都没能取回msg。查到的帖子大都是只有输入参数,没输出参数的,我这里需要获取输出参数。以及成功查询后的数据集。
[最优解释]
ADOStoredProc对象在ExecProc或Open以后,看看ADOStoredProc->RecordCount的值,是否有返回多个数据,如果有,通过ADOStoredProc->FieldByName等方式选取字段的值,然后ADOStoredProc->Next遍历下一个,如此类推。
[其他解释]
我用ADOStoredProc1-> ProcedureName = "bank_patient_info";
ADOStoredProc1-> Parameters-> Refresh();
ADOStoredProc1-> Parameters-> ParamByName( "@inpatient_no")-> Value = "00195746";
ADOStoredProc1-> Parameters-> ParamByName( "@msg")-> Value = "00";
//ADOStoredProc1-> Parameters-> ParamByName( "@参数_n ")-> Value = value_n;
ADOStoredProc1-> ExecProc();
// 获取返回值:
AnsiString ReturnValue = ADOStoredProc1-> Parameters-> ParamByName( "@msg")->Value;
已经能成功调用了。但不知道怎么取回数据
AnsiString ss = ADOStoredProc1-> Parameters-> ParamByName( "patient_id")->Value;这样不行,不是参数不能这样取。
[其他解释]
patient_id VARCHAR (12)
这个类型也得是output的,输出的
[其他解释]
这个patient_id和admiss_times等,是表中的字段还是存储过程中定义的变量?
[其他解释]
转ccrun贴
调用返回数据集的存储过程,用Open方法就可以了。假设有以下存储过程:
SQL codeCREATE PROCEDURE sp_Test
@a int
AS
BEGIN
SELECT * from 表名 where 字段=@a
END
GO
调用时:
C/C++ codeADOQuery1->Close();
ADOQuery1->SQL->Clear();
String str = String().sprintf(
TEXT("exec sp_Test ")
TEXT("@a=:a"));
ADOQuery1->SQL->Text = str;
int a = 2;
ADOQuery1->Parameters->Items[0]->Value = a; // 入参
try
{
ADOQuery1->Open();
}
catch(...)
{
}
ShowMessage(ADOQuery1->RecordCount);
测试的时候,放置DBGrid, DataSource, ADOQuery和ADOConnection并初始化相关属性,调用此存储过程后,数据表格中将显示符合条件的记录。
[其他解释]
存储过程不是我写的,其它公司的人写的,所以不知道他具体代码
patient_id和admiss_times等都是表里的字段,不是存储过程的参数。
[其他解释]
要到了他的存储过程代码了:
/****** Object: StoredProcedure [dbo].[bank_patient_info] Script Date: 02/08/2012 10:20:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:HERRY
-- Create date: 2011年9月16日
-- Description:
-- =============================================
CREATE PROCEDURE [dbo].[bank_patient_info]
-- Add the parameters for the stored procedure here
@inpatient_no varchar(10) = '0',
@msg varchar(200) output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
--SELECT @inpatient_no, @msg
set @msg ='查询正常'
if len(@inpatient_no)>=6 or (len(@inpatient_no)<=8)
begin
set @inpatient_no = right('00'+@inpatient_no,8)
if exists (select * From zy_inactpatient where inpatient_no =@inpatient_no)
begin
set @msg=@inpatient_no+'该病人已经预出院或结算,请到收费处咨询办理!'
end
else
begin
select top 1 a.patient_id,a.admiss_times, a.inpatient_no,a.name,a.admiss_date,
(case when a.sex=1 then '男' else '女' end) sex,
a.responce_type,c.name responce_name,
a.ward,b.ward_name,a.bed_no,a.total_charge,a.can_use_balance ,a.balance
From zy_actpatient a
left join zy_adtward b on a.dept =b.dept_sn and a.ward =b.ward_sn
left join zd_responce_type c on a.responce_type =c.code
where inpatient_no =@inpatient_no
if @@ROWCOUNT =0
begin
set @msg='无该住院号,请核查!'
end
end
end
else
begin
set @msg ='住院号录入有误!'
end
END
GO
[其他解释]
不是参数就不能这么取了,只能再Select这个字段,取出值来
[其他解释]
既然是表里的字段,这就好办了,执行了存储过程以后,读取记录集就行了,就象select一样。
[其他解释]
if(ADOStoredProc1-> Parameters-> ParamByName("@msg")->Value=="Ok")
{
adoQuery->Sql->Add("select patient_id from table");
adoQuery->Open();
if(adoQuery->RecordCount!=0)
n=adoQuery->FieldByName("patient_id")->AsInteger;
}
没CB,随便写了下,你试试
[其他解释]
具体如何取呢?执行存储过程之后。以前从未接触过,没经验。请大虾指点。谢谢。
[其他解释]
adoQuery->Sql->Add("select patient_id from table");
执行下来报错。
既然存储过程本身就是查询的,而且查询到了,为什么还要select语句查询呢?而且我还不知道table名。
[其他解释]
我这里D6+Oracle 10g,调用完再查,可以的。
不过一般的都写到存储过程输出类型变量里