我在我的数据库forex中创建了一个存储过程,代码如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER procedure [dbo].[jp_forex_t5_add] 
@key int
AS
if exists(select change from t5 where change=@key) 
 begin
   update t5 set counts = counts+1 where change=@key;
 end
else 
 begin
   insert into t5 values (@key,1)
 end
数据库forex中有一个表t5,其中含2个列:change(int)和counts(int)
然后在VC6写的应用程序中调用它:
SQLHANDLE hEnv , hConn , hStmt;
SQLRETURN sRet;
sRet = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
if(sRet!=SQL_SUCCESS && sRet!=SQL_SUCCESS_WITH_INFO)
return 1;
sRet = SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
if(sRet!=SQL_SUCCESS && sRet!=SQL_SUCCESS_WITH_INFO)
return 1;
sRet = SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hConn);
if(sRet!=SQL_SUCCESS && sRet!=SQL_SUCCESS_WITH_INFO)
return 1;
unsigned char conn_str[] = "driver=SQL Server;server=(local);database=forex";
unsigned char conn_buff[128];
short conn_buff_len;
sRet = SQLDriverConnect(hConn,hMainWnd,(unsigned char*)conn_str,sizeof(conn_str),
conn_buff,128,&conn_buff_len,SQL_DRIVER_COMPLETE);
if(sRet!=SQL_SUCCESS && sRet!=SQL_SUCCESS_WITH_INFO)
return 1;
sRet = SQLAllocHandle(SQL_HANDLE_STMT,hConn,&hStmt);
if(sRet!=SQL_SUCCESS && sRet!=SQL_SUCCESS_WITH_INFO)
return 1;
// sRet = SQLSetStmtAttr(hStmt,SQL_ATTR_CURSOR_TYPE,(void*)SQL_CURSOR_TYPE_DEFAULT,0); --这行不管有没有,都会失败 unsigned char sql_statement[] = "exec jp_forex_t5_add ?";
sRet = SQLPrepare(hStmt,(unsigned char*)sql_statement,SQL_NTS); int key;
long dwSize = 0;
SQLBindParameter(hStmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,4,0,&key,4,&dwSize); key = 0;
sRet = SQLExecute(hStmt); //执行这行没有问题,函数返回0,且数据库中的数据变化正确无误
key = 1;
sRet = SQLExecute(hStmt); //执行这行时,程序就卡在那里,这个函数长时间无法返回,打开任务管理器发现本程序的 CPU占用高达50%(机器是双核),还请高手指教代码是哪里错了???