ODBC API 懂的高手进。。

windows_ll 2010-09-26 09:34:59
bool IsInTable(INT16U tableNum,INT16U mno,char *inputOrder)//,char *inputOrder)//判断纪录是否存在
{//不在表中返回false,在表中则print出满足条件的其它列值。
SQLHENV serverhenv; //环境句柄
SQLHDBC serverhdbc; //连接句柄
SQLHSTMT serverhstmt; //语句句柄
SQLRETURN ret; //返回集 //short 类型

bool retn = false;

SQLINTEGER cb1 = strlen(inputOrder);

char stmt[100];//语句
sprintf(stmt,"select * from RGDB.dbo.input%d where Mno = ? and InputOrder like ?",tableNum);

SQLINTEGER cbn = 0,cbs = SQL_NTS;
//初始化环境
ret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&serverhenv);//初始化环境句柄
ret = SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);//设置环境句柄版本

//建立连接
ret = SQLAllocHandle(SQL_HANDLE_DBC,serverhenv,&serverhdbc);//初始化连接句柄
ret = SQLConnect(serverhdbc,(SQLCHAR*)"SQL Server",SQL_NTS,(SQLCHAR*)"Lucifer-PC",SQL_NTS,(SQLCHAR*)"",SQL_NTS);
//连接句柄,数据源,用户名,密码。
if(!SQL_SUCCEEDED(ret))
{
printf("数据库连接失败!");
return false;
}
else
{
printf("数据库连接成功!");
}

//初始化语句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);// statement handle

ret = SQLPrepare(serverhstmt,(SQLCHAR*)stmt,SQL_NTS);
//SQL_NTS is SQL null-terminated string
if(ret == SQL_SUCCESS||ret == SQL_SUCCESS_WITH_INFO)
{
ret = SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_SHORT,SQL_SMALLINT,0 ,0,&mno, 0,&cbn);
ret = SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR, SQL_CHAR, cb1 ,0,inputOrder, cb1,&cbs);
}

ret = SQLExecute(serverhstmt);//执行程序

while(1)
{
ret = SQLFetch(serverhstmt);
if(ret == SQL_ERROR || ret == SQL_SUCCESS_WITH_INFO)
{
printf("error SQLFetch\n");
}
if(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
retn = true;
SQLGetData(serverhstmt,3,SQL_C_LONG,&gateNum, 0,&cbn);
SQLGetData(serverhstmt,4,SQL_C_DOUBLE,&calcTime, 0,&cbn);//精度为6
SQLGetData(serverhstmt,5,SQL_C_CHAR,gate, 100,&cbs);
printf("%d,%f,%s\n",gateNum,calcTime,gate);
}
else{
break;
}
}

return retn;
SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);//正确的释放 四个步骤
SQLDisconnect(serverhdbc);
SQLFreeHandle(SQL_HANDLE_DBC,serverhdbc);
SQLFreeHandle(SQL_HANDLE_ENV,serverhenv);
}

//该函数的功能是 在表

USE [RGDB]
GO
/****** 对象: Table [dbo].[input4] 脚本日期: 09/26/2010 21:29:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[input4](
[Mno] [smallint] NOT NULL,
[InputOrder] [nchar](15) NOT NULL,
[GateNum] [int] NOT NULL,
[CalcTime] [float] NOT NULL,
[Gate] [varchar](max) NOT NULL,
CONSTRAINT [PK_input4] PRIMARY KEY CLUSTERED
(
[Mno] ASC,
[InputOrder] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

查找 与Mno相同且 InputOrder相同 的行,若不存在则返回false,若存在则打印出符合条件行的另外3列的值。

但是问题出在 InputOrder like ? 上 两个字符串无法进行正确的比较。请高手指教。 并且满足函数功能时用的分支结构好像不太好,因为不太清楚用哪个函数直接判断返回集是否为空,且不用移动游标。 谢谢!
...全文
31 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dawugui 2010-09-26
不懂,帮顶,学习,蹭分.
回复
windows_ll 2010-09-26
。。。不是吧,哎,ODBC实在没什么人懂,麻烦版主看到帮忙转版,谢谢啦~
回复
喜-喜 2010-09-26
建议 LZ 到嵌套 SQL 的那个语言板块儿去发帖!

看代码,像是 C 语言!到 C 语言版块儿去发帖吧...
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-09-26 09:34
社区公告
暂无公告