ODBC API

Navigation:  C++ >

ODBC API

Previous pageReturn to chapter overviewNext page

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;

}