VS2010 C++使用ASE15.7 Client-library封装一个操作存储过程关于参数的问题

天妒WS 2014-07-20 07:13:01
存储过程如下:
create procedure sp_TestProc(
@name varchar(10),
@age int,
@outChar varchar(20) output,
@outInt int output
)
as
begin
IF @age > 20
begin
select outChar='more then 20', outInt=2 * @age
end
ELSE
begin
select outChar='less then 20', outInt=@age
end
end

程序里是这么用的:

strcpy(m_szSqlText, "sp_TestProc");
ret = ct_command(cmd, CS_RPC_CMD, m_szSqlText, CS_NULLTERM, CS_NO_RECOMPILE);

char type[] = "A";
int tot_sales = 10;
char num_books[30];
int retResult = -1;

/* Define the first input parameter of type character. */
memset(&datafmt,0,sizeof(datafmt));
strcpy(datafmt.name,"");
datafmt.namelen = CS_NULLTERM ;
datafmt.datatype = CS_CHAR_TYPE ;
datafmt.maxlength = 255;
datafmt.status = CS_INPUTVALUE ;
datafmt.locale = NULL ;
ret = ct_param ( cmd, &datafmt, (CS_VOID *)type,NULL, 1);

/* Define the second input parameter which is of type integer. */
strcpy(datafmt.name,"");
datafmt.namelen = CS_NULLTERM ;
datafmt.datatype = CS_INT_TYPE ;
datafmt.maxlength = sizeof(CS_INT) ;
datafmt.status = CS_INPUTVALUE ;
datafmt.locale = NULL ;
ret = ct_param ( cmd, &datafmt, (CS_VOID *)&tot_sales,NULL, 2);

/* Define the output parameter now. */
strcpy(datafmt.name,"");
datafmt.namelen = CS_NULLTERM ;
datafmt.datatype = CS_CHAR_TYPE ;
datafmt.maxlength = 255;
datafmt.status = CS_RETURN ;
datafmt.locale = NULL ;
ret = ct_param ( cmd, &datafmt, (CS_VOID *)num_books,NULL, 3);

/* Define the output parameter now. */
strcpy(datafmt.name,"");
datafmt.namelen = CS_NULLTERM ;
datafmt.datatype = CS_INT_TYPE ;
datafmt.maxlength = sizeof(CS_INT) ;
datafmt.status = CS_RETURN ;
datafmt.locale = NULL ;

ret = ct_param ( cmd, &datafmt, (CS_VOID *)&retResult,NULL, 4);
ret = ct_send ( cmd );

while ((ret = ct_results(cmd, &result_type)) == CS_SUCCEED)
{
switch ((int)result_type)
{
case CS_PARAM_RESULT:
ret = ct_res_info(cmd, CS_NUMDATA, &num_cols, CS_UNUSED, NULL);
for (int i = 1; i <= num_cols; i++ )
{
memset(&target_format, 0, CS_SIZEOF(target_format));
target_format.datatype = CS_CHAR_TYPE;
target_format.maxlength = 255;
target_format.count = 1;
target_format.format = CS_FMT_NULLTERM;

ret = ct_bind ( cmd, i, &target_format, m_colbuf[i-1], NULL, NULL);
}
while ( (ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, (CS_INT *)NULL)) == CS_SUCCEED )
{
}
break;

case CS_STATUS_RESULT:
ret = ct_res_info(cmd, CS_NUMDATA, &num_cols, CS_UNUSED, NULL);
for (int i = 1; i <= num_cols; i++ )
{
memset(&target_format, 0, CS_SIZEOF(target_format));
target_format.datatype = CS_CHAR_TYPE;
target_format.maxlength = 255;
target_format.count = 1;
target_format.format = CS_FMT_NULLTERM;

ret = ct_bind ( cmd, i, &target_format, m_colbuf[i-1], NULL, NULL);
}
while ( (ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, (CS_INT *)NULL)) == CS_SUCCEED )
{
//调试发现,这里可以看到存储过程执行的结果,执行成功是0
}

break;
case CS_ROW_RESULT:
ret = ct_res_info(cmd, CS_NUMDATA, &num_cols, CS_UNUSED, NULL);
for (int i = 1; i <= num_cols; i++ )
{
memset(&target_format, 0, CS_SIZEOF(target_format));
target_format.datatype = CS_CHAR_TYPE;
target_format.maxlength = 255;
target_format.count = 1;
target_format.format = CS_FMT_NULLTERM;

ret = ct_bind ( cmd, i, &target_format, m_colbuf[i-1], NULL, NULL);
}
while ( (ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, (CS_INT *)NULL)) == CS_SUCCEED )
{
//在这里调试能看到存储过程输出参数的值
}
break;

case CS_CMD_FAIL:
return CS_FAIL;
default:
break;
}


}

现在遇到的问题是:1.上面我是知道存储过程的输入输出参数的个数,使用ct _param设置入参出参的值,假如我只知道存储过程的名字,不知道入参出参个数,怎么设置参数的值,有什么办法获取参数的信息吗,使用ct_dynamic没搞出来。
2.在公司同样的代码,ASE服务器不在自己机子上装的,发现循环处理结果的时候,先是CS_STATUS_RESULT,获取到执行结果,然后是CS_ROW_RESULT,获取到各个输入参数的值。在自己子上装了个ASE服务器,发现处理结果的时候,直接是CS_ROW_RESULT,没有CS_STATUS_RESULT,不知道怎么回事。
请各个大神指教,在线等。。。
...全文
210 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
iihero 2014-09-03
  • 打赏
  • 举报
回复
1.上面我是知道存储过程的输入输出参数的个数,使用ct _param设置入参出参的值,假如我只知道存储过程的名字,不知道入参出参个数,怎么设置参数的值,有什么办法获取参数的信息吗,使用ct_dynamic没搞出来。 >>: 参数的元信息? 风险比较大. 2. 在公司同样的代码,ASE服务器不在自己机子上装的,发现循环处理结果的时候,先是CS_STATUS_RESULT,获取到执行结果,然后是CS_ROW_RESULT,获取到各个输入参数的值。在自己子上装了个ASE服务器,发现处理结果的时候,直接是CS_ROW_RESULT,没有CS_STATUS_RESULT,不知道怎么回事。 >>:

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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