+ -
当前位置:首页 → 问答吧 → ODBC API调用存储过程一个问题?

ODBC API调用存储过程一个问题?

时间:2010-07-06

来源:互联网

下面是一个存储过程。通过ODBC API调用该存储过程。

create procedure MeterFactorySave_p  
  @render varchar (64) output ,
  @meterFactoryCode varchar(3),  
  @meterFactoryName varchar (64)  
as
  declare @meterCode varchar(3)
begin
  select @meterCode=count(*) from madeMeterFactory_t where factoryCode=@meterFactoryCode and isvalid='1'
  if @meterCode>0
  begin
set @render='该编码已经存在'
  end
  else
  begin
insert into madeMeterFactory_t(factoryCode,factoryName,dates) values(@meterFactoryCode,@meterFactoryName,convert(varchar(32),getDate(),120))
set @render='保存成功!'
end
  return 1024
end

问题是不能返回红体中的变量值@render,如果将红体中的插入语句注释掉,那么就可以返回变量 @render的值,请问是怎么回事?

作者: 光速   发布时间: 2010-07-06

调用存储过程的函数如下:
saveMeterFactory_p(char *meterFactoryCode,char* meterFactoryName)
{
char sql[100];
  SQLCHAR szOutput[64];
SQLINTEGER cb1=SQL_NTS, cb2=SQL_NTS, cb3=SQL_NTS, cb4=SQL_NTS;
SQLINTEGER iReturnVal=0;
memset(szOutput,0,64);
memset(sql,0,100);
sprintf(sql,"{?=call MeterFactorySave_p(?,?,?)}");

SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv); //分配环境句柄
  SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0); //设置驱动程序属性(版本等)
  SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc); //分配连接句柄
  retcode = SQLDriverConnect(hdbc,NULL,ConnStr,SQL_NTS,ConnStrOut, sizeof(ConnStrOut),&ConnStrOutLen,SQL_DRIVER_NOPROMPT);
//函数SQLDriveConnect用一个连接字符串建立至数据源的连接。
  retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); //初始化语句句柄
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_OUTPUT, SQL_C_LONG,SQL_INTEGER, 0, 0, &iReturnVal, 0, &cb1);
retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_OUTPUT, SQL_C_CHAR,SQL_VARCHAR, 64, 0, szOutput, 64, &cb2);
retcode = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_VARCHAR, 4, 0, meterFactoryCode, 3, &cb3);
retcode = SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_VARCHAR, 32, 0, meterFactoryName, 32, &cb4);
  retcode = SQLExecDirect (hstmt,(SQLCHAR *)sql, SQL_NTS);
   
MessageBox(NULL,szOutput,MessBoxCap,MB_ICONWARNING);

}

作者: 光速   发布时间: 2010-07-06

insert 成功了? 或者是不是数据库 ODBC 驱动有问题?
没看出毛病来, 话说到现在还有使用 ODBC API 的公司啊。

作者: zylthinking   发布时间: 2010-07-06



QUOTE:
insert 成功了? 或者是不是数据库 ODBC 驱动有问题?
没看出毛病来, 话说到现在还有使用 ODBC API 的公 ...
zylthinking 发表于 2010-07-06 16:21



我就是学习学习。

作者: 光速   发布时间: 2010-07-06



QUOTE:
insert 成功了? 或者是不是数据库 ODBC 驱动有问题?
没看出毛病来, 话说到现在还有使用 ODBC API 的公 ...
zylthinking 发表于 2010-07-06 16:21




    驱动没有问题的。

作者: 光速   发布时间: 2010-07-06

我5年多不玩sql了, 不一定能有帮助啊, 不过我不记得存储过程能够使用 return啊, 我看你的语法, 似乎是 sql server吧

作者: zylthinking   发布时间: 2010-07-06



QUOTE:
我5年多不玩sql了, 不一定能有帮助啊, 不过我不记得存储过程能够使用 return啊, 我看你的语法, 似乎是  ...
zylthinking 发表于 2010-07-06 16:50


是sql server.

作者: 光速   发布时间: 2010-07-06

1,看insert语句有没问题
2,加入 set nocount on 语句试试

作者: 梦星月   发布时间: 2010-07-06



QUOTE:
1,看insert语句有没问题
2,加入 set nocount on 语句试试
梦星月 发表于 2010-07-06 17:06




insert没有问题。
添加了set nocount on还是没有返回字符串。

作者: 光速   发布时间: 2010-07-06

当插入数据表中已有的编码时,执行存储过程返回"该编码已经存在"字符串。
当插入数据表中没有的编码时,执行存储过程返回空字符(按照要求应该返回"保存成功!"字符串)。

作者: 光速   发布时间: 2010-07-06

作者: 光速   发布时间: 2010-07-06