首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

BCB调用存储过程有关问题

2012-12-16 
BCB调用存储过程问题要调用名为bank_patient_info的存储过程函数,传入参数住院号@inpatient_novarchar(10)

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,调用完再查,可以的。
不过一般的都写到存储过程输出类型变量里

热点排行