我在我的数据库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%(机器是双核),还请高手指教代码是哪里错了???
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%(机器是双核),还请高手指教代码是哪里错了???
解决方案 »
- SQL SERVER2005中的基础类问题,大家帮忙看下哈
- 哪有SQL Server 2000 reporting service 企业版 下载
- 基础触发器,添加或修改数据时判断条件
- 请问索引列的值为''还是为null快?
- 幫忙,語句有什麼不一樣!
- 如何把一个字符串拆开,赋值给两个变量。
- 如何让SQLServer执行SQL时不写日志?
- (重开贴,遇到个垃圾发广告)救救我呀,我在安装SQL2000的时候,选择默认排序规则里,点上了区分大小写,现在SQL区分大小写了,怎么样改回去?
- SqlServer2000中行列转换的问题?
- 关于存储过程表名作为参数的性能的问题
- 请教远程SQL服务器共享的问题
- 还是关于触发器的问题,这次是关于删除的触发器
sRet = SQLExecute(hStmt); 查一下KEY=1的语句是什么样子
unsigned char sql_statement[] = "{call jp_forex_t5_add(?)}";
解决了!感谢关注