求助:C++builder调用存储出现的问题

彭家老三 2011-09-20 10:49:16
我手动在SQL里执行这个存储都是OK的,结果也能显示出来,但用以下代码在C++builder里就出现错误提示“ProcCheckLMacWMac:Field'Measured' not found”,其中ProcCheckLMacWMac是一个ADOStoredProc控件,请大家帮忙看看是什么问题,谢谢了。

void __fastcall TForm1::Button3Click(TObject *Sender)
{
ProcCheckLMacWMac->Parameters->Clear();
ProcCheckLMacWMac->Close();
ProcCheckLMacWMac->Connection=ADOConnection1;
ProcCheckLMacWMac->Prepared=true;
ProcCheckLMacWMac->ProcedureName="SP_TestGetSNData;1";
ProcCheckLMacWMac->Parameters->CreateParameter("@SN",ftString,pdInput,50,OleVariant(0));
ProcCheckLMacWMac->Parameters->CreateParameter("@DataType",ftString,pdInput,50,OleVariant(0));

ProcCheckLMacWMac->Parameters->ParamByName("@SN")->Value="ANK1E2H19JW0001";
ProcCheckLMacWMac->Parameters->ParamByName("@DataType")->Value="PreMac";

ProcCheckLMacWMac->ExecProc();
//Sleep(5000);

AnsiString s1=ProcCheckLMacWMac->FieldByName("@Measured")->AsString;

Edit1->Text=s1;
}
...全文
143 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
彭家老三 2011-09-20
  • 打赏
  • 举报
回复
好吧,我这坑爹的电脑啊,同样下面的代码,在我同事的电脑里能得到结果,在我的电脑里竟然是异常

ProcGetSNData->Close();
ProcGetSNData->Parameters->Items[1]->Value = "ANK1E2H19J20001";
ProcGetSNData->Parameters->Items[2]->Value = "PreMac";
ProcGetSNData->Open();
AnsiString xx = ProcGetSNData->FieldByName("Measured")->AsString;
Edit2->Text = xx;

多谢柔情哥,多谢妖哥。多谢两位酱油哥,呵呵。。。。
彭家老三 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ccrun 的回复:]

来,再试:
C/C++ code
ProcCheckLMacWMac->Close();
ProcCheckLMacWMac->Connection = ADOConnection1;
ProcCheckLMacWMac->Prepared = true;

ProcCheckLMacWMac->SQL->Text = String().sprintf(
TEXT("……
[/Quote]
妖哥,我用的是C++builder6.0 上面提示E2316 'SQL' is not a member of 'TADOStoredProc',好像ProcCheckLMacWMac里没有SQL,难道说我这个IDE有问题?
纯冰糖 2011-09-20
  • 打赏
  • 举报
回复
好了没,试下老妖的代码吧,偶准备吃饭了。
ccrun.com 2011-09-20
  • 打赏
  • 举报
回复
来,再试:
ProcCheckLMacWMac->Close();
ProcCheckLMacWMac->Connection = ADOConnection1;
ProcCheckLMacWMac->Prepared = true;

ProcCheckLMacWMac->SQL->Text = String().sprintf(
TEXT("exec SP_TestGetSNData ")
TEXT("@SN=:SN,")
TEXT("@DataType=:DataType"));

ProcCheckLMacWMac->Parameters->Items[0]->Value = String("ANK1E2H19JW0001");
ProcCheckLMacWMac->Parameters->Items[1]->Value = String("PreMac");

ProcCheckLMacWMac->Open();

AnsiString str = ProcCheckLMacWMac->FieldByName("@Measured")->AsString;

Edit1->Text = str;
纯冰糖 2011-09-20
  • 打赏
  • 举报
回复
一调试就可以看到输入、输出参数了。
纯冰糖 2011-09-20
  • 打赏
  • 举报
回复
先在查询分析器里调试一下存储过程吧
彭家老三 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ccrun 的回复:]

引用 8 楼 pengjialaosan 的回复:结果提示“List index out of bounds(1)”

这是索引越界,改成:
ProcGetSNData->Close();
ProcGetSNData->Parameters->Items[0]->Value = "ANK1E2H19J20001";
ProcGetSNData->Parameters->Items[1]……
[/Quote]
不好意思妖哥,我忘记说了,我最初写的就是这个,提示“List index out of bounds(0)”
纯冰糖 2011-09-20
  • 打赏
  • 举报
回复
压根就没有输出声明啊
ccrun.com 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 pengjialaosan 的回复:]结果提示“List index out of bounds(1)”[/Quote]

这是索引越界,改成:
ProcGetSNData->Close();
ProcGetSNData->Parameters->Items[0]->Value = "ANK1E2H19J20001";
ProcGetSNData->Parameters->Items[1]->Value = "PreMac";
ProcGetSNData->Open();
AnsiString xx = ProcGetSNData->FieldByName("Measured")->AsString;
Edit2->Text = xx;
纯冰糖 2011-09-20
  • 打赏
  • 举报
回复
怎么也没个
@retint int output, --返回成功与失败标记
@retval varchar(250) output --返回信息
类似的声明啊
彭家老三 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 rouqing 的回复:]

应该是 @return_value
[/Quote]
您帮忙看看这个存储吧,我刚刚跟他们要的

USE [SMT]
GO
/****** Object: StoredProcedure [dbo].[SP_TestGetSNData] Script Date: 09/20/2011 11:20:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO



--exec SP_TestGetSNData @SN='ATN4S01500GX',@DataType='LCMID'

ALTER procedure [dbo].[SP_TestGetSNData]

(
@SN varchar(50),
@DataType varchar(50)=''
)

As
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--*Program*: <Function Test>
--*Programer*:<Udall>
--*Date*:<2009/09/14>
--*Unify*:<UY>
--*Description*:<应用于程测试序,工程测试直接Call存储>
--########## Parameter Description Begin ##########
--@SN: 序号
--########## Parameter Description End # ##########
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
set nocount on
Declare @MAC varchar(50)
Declare @Modelname varchar(30)
Declare @WO varchar(30)

select @Modelname=isnull(ModelName,''),@WO=WorkOrder from SMT_SP with(nolock) where SerialNumber=@SN
if @DataType='PreMac'
begin
select Measured from SMT_FVS where
SerialNumber=@sn and Tstation='PreUI'
end
if @DataType='PINCode'
begin
set @MAC=''
select @MAC=isnull(MAC,'') from SN_MAC with(nolock) where SN=@SN
if @MAC<>''
begin
select isnull(MAC,'') as MAC,isnull(PINCode,'') as PINCode from MAC_PINCode with(nolock) where MAC=@MAC
end
else
begin
select '' as MAC,'' as PINCode
end

return
end

if @DataType='Mac'
begin
set @MAC=''
select @MAC=ISNULL(Mac,'') from SN_Mac with(nolock) where SN=@SN

select @MAC Mac
return
end
if @DataType='LCMID'
begin
Declare @LCD varchar(1000)
declare @split varchar(10)

select @LCD=Value from ModelName_Data where ModelName=@Modelname and FuncType='LCMID' and Item='LCMID'
set @split=';'
select a LCD from func_split(@LCD,@split)
end

if @DataType='ModelDesc'
begin
if @Modelname<>''
begin
select 'OK' Result,ISNULL(ModelDesc,'') as ModelDesc from ModelName where ModelName=@Modelname
return
end
else
begin
select 'Fail' Result,'' as ModelDesc
return
end
end

if @DataType='SAP_WO_List'
begin
select * from SAP_WO_LIST where WO=@WO
return
end





纯冰糖 2011-09-20
  • 打赏
  • 举报
回复
应该是 @return_value

纯冰糖 2011-09-20
  • 打赏
  • 举报
回复
"没有这个字段,传进的参数就两个,这个是得到的结果"

就算是结果也有个输出的吧,没有参数咋输出的
彭家老三 2011-09-20
  • 打赏
  • 举报
回复
由于存储是另一个部门的人维护的,我看不到,只能右键执行:

USE [SMT]
GO

DECLARE @return_value int

EXEC @return_value = [dbo].[SP_TestGetSNData]
@SN = 'ANK1E2H19JW0001',
@DataType = 'PreMac'

SELECT 'Return Value' = @return_value

GO

彭家老三 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rouqing 的回复:]

存储过程里Measured这个字段是不是输出类型的?
有没有这个字段
[/Quote]
没有这个字段,传进的参数就两个,这个是得到的结果。
我刚刚又用

ProcGetSNData->Close();
ProcGetSNData->Parameters->Items[1]->Value = "ANK1E2H19J20001";
ProcGetSNData->Parameters->Items[2]->Value = "PreMac";
ProcGetSNData->Open();
AnsiString xx = ProcGetSNData->FieldByName("Measured")->AsString;
Edit2->Text = xx;
}

结果提示“List index out of bounds(1)”
纯冰糖 2011-09-20
  • 打赏
  • 举报
回复
设置该字段类型为输出,你创建参数时也没有创建
彭家老三 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ccrun 的回复:]
汗。。。
[/Quote]
妖哥,您也帮忙看看吧,我之前写了“Measured”出现错误提示,以为前面要加@,结果还是出现错误,手动在SQL里执行都是可以的。
纯冰糖 2011-09-20
  • 打赏
  • 举报
回复
存储过程里Measured这个字段是不是输出类型的?
有没有这个字段
ccrun.com 2011-09-20
  • 打赏
  • 举报
回复
你这个 SP_TestGetSNData 存储过程里,有几个参数,可有出参?如果Measured是作为出参,可以试试以下代码:

ProcCheckLMacWMac->Parameters->CreateParameter("@SN",ftString,pdInput,50,OleVariant(0));
ProcCheckLMacWMac->Parameters->CreateParameter("@DataType",ftString,pdInput,50,OleVariant(0));
ProcCheckLMacWMac->Parameters->CreateParameter("@Measured",ftString,pdOutput,50,OleVariant(0));

ProcCheckLMacWMac->Parameters->ParamByName("@SN")->Value="ANK1E2H19JW0001";
ProcCheckLMacWMac->Parameters->ParamByName("@DataType")->Value="PreMac";

ProcCheckLMacWMac->ExecProc();
AnsiString s1=ProcCheckLMacWMac->ParamByName("@Measured")->AsString;
彭家老三 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 rouqing 的回复:]

AnsiString s1=ProcCheckLMacWMac->FieldByName("@Measured")->AsString;

去掉@符号
[/Quote]
谢谢您,但还是不行,提示“ProcCheckLMacWMac:Field'Measured' not found”
加载更多回复(2)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧