HDODBC提供一些简单的ODBC接口以支持SQL查询。(客户端安装后在系统中提供了ODBC驱动,具体参考用户手册,功能明细 > 数据据询 > ODDC与SQL查询 > ODBC Driver)
●支持的ODBC接口
▪申请句柄接口
SQLRETURN SQL_API SQLAllocHandle(SQLSMALLINT HandleType,SQLHANDLE InputHandle, SQLHANDLE *OutputHandle);
接口详细说明参见http://msdn.microsoft.com/en-us/library/ms712455(v=vs.85).aspx
▪释放句柄接口
SQLRETURN SQL_API SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle);
接口详细说明参见http://msdn.microsoft.com/en-us/library/ms710123(v=vs.85).aspx
▪连接数据源接口
SQLRETURN SQL_API SQLConnect(SQLHDBC ConnectionHandle,
SQLCHAR *ServerName, SQLSMALLINT NameLength1,
SQLCHAR *UserName, SQLSMALLINT NameLength2,
SQLCHAR *Authentication, SQLSMALLINT NameLength3);
接口详细说明参见http://msdn.microsoft.com/en-us/library/ms711810(v=vs.85).aspx
▪断开数据源连接接口
SQLRETURN SQL_API SQLDisconnect(SQLHDBC ConnectionHandle);
接口详细说明参见http://msdn.microsoft.com/en-us/library/ms713946(v=vs.85).aspx
▪设置连接属性接口
SQLRETURN SQL_API SQLSetConnectAttr(SQLHDBC ConnectionHandle,
SQLINTEGER Attribute, SQLPOINTER Value,
SQLINTEGER StringLength);
接口详细说明参见http://msdn.microsoft.com/en-us/library/ms713605%28v=vs.85%29.aspx
▪执行sql接口
SQLRETURN SQL_API SQLExecDirect
(
SQLHSTMT StatementHandle,
__in_ecount_opt(TextLength) SQLCHAR* StatementText,
SQLINTEGER TextLength
);
接口详细说明参见http://msdn.microsoft.com/en-us/library/ms713611(v=vs.85).aspx
▪获取查询结果接口
SQLRETURN SQL_API SQLFetch(SQLHSTMT StatementHandle);
接口详细说明参见http://msdn.microsoft.com/en-us/library/ms712424(v=vs.85).aspx
▪绑定列接口
SQLRETURN SQL_API SQLBindCol(SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType,
SQLPOINTER TargetValue, SQLLEN BufferLength,
SQLLEN *StrLen_or_Ind);
接口详细说明参见http://msdn.microsoft.com/en-us/library/ms711010(v=vs.85).aspx
▪数据源查询接口
SQLRETURN SQL_API SQLDataSources(SQLHENV EnvironmentHandle,
SQLUSMALLINT Direction, SQLCHAR *ServerName,
SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1,
SQLCHAR *Description, SQLSMALLINT BufferLength2,
SQLSMALLINT *NameLength2);
接口详细说明参见http://msdn.microsoft.com/en-us/library/ms711004(v=vs.85).aspx
●代码示例
example
#include "sql.h"
#include <sqlext.h>
int32 main(int argc, char** argv)
{
SQLHANDLE hEnv = SQL_NULL_HENV;
SQLHANDLE hDbc = SQL_NULL_HDBC;
SQLHANDLE hStmt = SQL_NULL_HSTMT;
SQLRETURN nRet = SQL_SUCCESS;
HDBC* pHDDbc = NULL;
int8 nTimeOut = 3;
char szSQL[1024];
char szTagName[128];
char szTimeStr[24];
uint16 nQuality;
int32 nValue;
char szValue[1024];
float64 fValue;
char szTimeStep[24];
char szInterType[24];
int32 nCount = 0;
// 申请HDODBC环境句柄
nRet = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &hEnv);
if(SQL_SUCCESS != nRet)
{
return nRet;
}
// 申请HDODBC连接句柄
nRet = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 设置HDODBC连接超时
nRet = SQLSetConnectAttr(hDbc, SQL_ATTR_CONNECTION_TIMEOUT, &nTimeOut, sizeof(nTimeOut));
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 连接数据源abc
nRet = SQLConnect(hDbc, (SQLCHAR*)"abc", strlen("abc") + 1, NULL, 0, NULL , 0);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 申请Stmt句柄
nRet = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 执行SQL
strcpy(szSQL, "select * from HDInter where Ftag=\'TAG\' and FTime >= \'2013-09-12 10:00:00.000\' and FTime <= \'2013-09-18 11:00:00.000\' LIMIT 10 DESC");
nRet = SQLExecDirect(hStmt, (SQLCHAR*)szSQL, strlen(szSQL) + 1);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 绑定字段buffer
nRet = SQLBindCol(hStmt, 0, SQL_CHAR, szTagName, 128, 0);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 绑定字段buffer
nRet = SQLBindCol(hStmt, 1, SQL_CHAR, szTimeStr, 128, 0);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 绑定字段buffer
nRet = SQLBindCol(hStmt, 2, SQL_INTEGER, &nQuality, sizeof(nQuality), 0);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 绑定字段buffer
nRet = SQLBindCol(hStmt, 3, SQL_INTEGER, &nValue, sizeof(nValue), 0);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 绑定字段buffer
nRet = SQLBindCol(hStmt, 4, SQL_CHAR,szValue, sizeof(szValue), 0);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 绑定字段buffer
nRet = SQLBindCol(hStmt, 5, SQL_FLOAT,&fValue, sizeof(fValue), 0);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 绑定字段buffer
nRet = SQLBindCol(hStmt, 6, SQL_CHAR,szTimeStep, sizeof(szTimeStep), 0);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 绑定字段buffer
nRet = SQLBindCol(hStmt, 7, SQL_CHAR,szInterType, sizeof(szInterType), 0);
if(SQL_SUCCESS != nRet)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return nRet;
}
// 逐条取查询结果并printf
while(SQL_SUCCESS == SQLFetch(hStmt))
{
printf("Tag=%s, Time=%s,Quality=%d,FIValue=%d,FSValue=%s,FFValue=%f, FTimeStep=%s,FinterType=%s\n",
szTagName, szTimeStr, nQuality,nValue,szValue,fValue, szTimeStep,szInterType);
}
// 断开连接
SQLDisconnect(hDbc);
// 释放句柄
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return 1;
}