使用ODBC API之前要用到的头文件和LIB库
#include "sql.h" // This is the the main include for ODBC Core functions.
#include "sqlext.h" // This is the include for applications using the Microsoft SQL Extensions
#include "sqltypes.h" // This file defines the types used in ODBC
#include "sqlucode.h" // This is the the unicode include for ODBC Core functions
#include "odbcss.h" // This is the application include file for the SQL Server driver specific defines.
#pragma coment(lib, "odbc32.lib")
ODBC API的返回值
ODBC API的返回值定义为:SQLRETURN。在成功时返回值为:SQL_SUCCESS, SQL_SUCCESS_WITH_INFO;在失败时返回错误代码。一点需要注意的是如果ODBC返回值为:SQL_SUCCESS_WITH_INFO并不表明执行完全成功,而是表明执行成功但是带有一定错误信息。当执行错误时ODBC返回的是一个错误信息的结果集,你需要遍历结果集合中所有行,这点和后面讲到的查询SQL语句执行结果集的思路很类似。
SQLAllocHandle 创建ODBC句柄
SQLRETURN SQLAllocHandle (
SQL SMALLINT HandleType, // 需要申请的句柄类型
SQLHANDLE InputHandle, // 输入句柄
SQLHANDLE * OutputHandlePtr); // 输出句柄,即在第一参数指定需要申请的句柄
第一参数HandleType的取值可以为:
1. SQL_HANDLE_ENV
2. SQL_HANDLE_DBC
3. SQL_HANDLE_STMT
SQLConnect 连接数据库
SQLRETURN SQLConnect (
SQLHDBC ConnectionHandle, // DBC句柄,hdbc
SQLCHAR * ServerName, // 为ODBC的DSN名称
SQLSMALLINT NameLength1, // 指明参数ServerName的长度(可以用SQL_NTS)
SQLCHAR * UserName, // 数据库用户名
SQLSMALLINT NameLength2, // 指明参数UserName的长度(可以用SQL_NTS)
SQLCHAR * Authentication, // 数据库用户密码
SQLSMALLINT NameLength3) // 指明参数Authentication的长度(可以用SQL_NTS)
例如:
SQLConnect (
hdbc,
(SQLTCHAR*)szDSN, SQL_NTS,
(SQLTCHAR*)szUserId, SQL_NTS,
(SQLTCHAR*)szPassword, SQL_NTS);
SQLExecDirect 直接执行SQL语句
SQLRETURN SQLExecDirect (
SQLHSTMT StatementHandle, // STMT句柄
SQLCHAR * StatementText, // SQL语句
SQLINTEGER TextLength) // 参数StatementText的长度,可以用SQL_NTS
如果函数执行成功,你将会得到一个结果集,否则将返回错误信息。
获取SQL语句执行的结果
对于SQL查询语句,ODBC会返回一个光标,与光标对应的是一个结果集合(可以理解为一个表格)。开发人员利用光标来浏览所有的结果,你可以利用ODBC API函数移动光标,并且获取当前光标指向的行的列字段的数值。此外还可以通过光标来对光标当前所指向的数据进行修改,而修改会直接反映到数据库中。
SQLFetch 移动光标
SQLRETURN SQLFetch (SQLHSTMT StatementHandle);
在你调用SQLExecDirect执行SQL语句后,你需要遍历结果集来得到数据。StatementHandle是STMT句柄,此句柄必须是被执行过。当调用SQLFetch 函数后,光标会被移动到下一条记录处,当光标移动到记录集的最后一条,函数将会返回SQL_NO_DATA。
SQLGetData 得到光标处的某列的值
SQLRETURN SQLGetData (
SQLHSTMT StatementHandlem, // STMT句柄
SQLUSMALLINT ColumnNumber, // 列号,以1开始
SQLSMALLINT TargetType, // 数据缓冲区(TargetValuePtr)的C语言类型
SQLPOINTER TargetValuePtr, // 数据缓冲区
SQLINTEGER BufferLength, // 数据缓冲区(TargetValuePtr)的长度
SQLINTEGER * StrLen_or_IndPtr); // 返回当前字段得到的字节长度
SQLBindCol通过列绑定获得字段数据
SQLRETURN SQLBindCol (
SQLHSTMT StatementHandle, // STMT语句
SQLUSMALLINT ColumnNumber, // 列号,以1开始
SQLSMALLINT TargetType, // 数据缓冲区(TargetValuePtr)的C语言类型
SQLPOINTER TargetValuePtr, // 数据缓冲区
SQLINTEGER BufferLength, // 数据缓冲区(TargetValuePtr)的字节长度
SQLINTEGER * StrLen_or_IndPtr); // 返回当前字段得到的字节长度
在从结果集中读取字段值时可以利用SQLGetData,但为了速度可以利用列绑定(SQLBindCol)的方式,在每次移动光标后让ODBC将数据传送到指定的变量中
SQLNumResultCols 得到结果集中列数
SQLRETURN SQLNumResultCols (
SQLHSTMT StatementHandle, // STMT句柄
SQLSMALLINT * ColumnCountPtr); // 返回的列数
SQLRowCount 执行SQL语句后得到影响的行数
SQLRETURN SQLRowCount (
SQLHSTMT StatementHandle, // STMT句柄
SQLINTEGER * RowCountPtr); // 被影响的数据的行数
你可以通过SQLExecDirect执行SQL语句来插入,修改和删除数据,在执行插入,修改和删除的SQL语句后就可以通过SQLRowCount函数来得到被影响的数据的行数。
SQLDescribeCol 得到结果集中列的描述
SQLRETURN SQLDescribeCol (
SQLHSTMT StatementHandle, // STMT句柄
SQLSMALLINT ColumnNumber, // 需要得到的列的序号,从1开始计算
SQLCHAR * ColumnName, // 得到列的名称
SQLSMALLINT BufferLength, // 指明ColumnName参数的最大长度
SQLSMALLINT * NameLengthPtr, // 返回列名称的长度
SQLSMALLINT * DataTypePtr, // 返回列的ODBC数据类型,见表
SQLUINTEGER * ColumnSizePtr, // 返回列的长度
SQLSMALLINT * DecimalDigitsPtr, // 当列为数字类型时返回小数点后数据的位数
SQLSMALLINT * NullablePtr); // 指明该列是否允许空值
SQLSetStmtAttr设置ODBC光标类型
SQLRETURN SQLSetStmtAttr (
SQLHSTMT StatementHandle, // STMT句柄
SQLINTEGER Attribute, // 指定需要设置的属性类型
SQLPOINTER ValuePtr, // 提供的参数值
SQLINTEGER StringLength); // 指定参数的长度,当参数是整数时设置为
// SQL_IS_INTEGER, 当参数是字符串是设置
// 为字符串长度或者是SQL_NTS
函数SQLSetStmtAttr可以让我们在ODBC中可以使用不同的光标类型
Attribute
ValuePtr
作用
SQL_ATTR_ASYNC_ENABLE 整数,取值为:FetchOrientation
含 义
SQL_FETCH_NEXT 滚动到下一行,这时候调用相当与SQLFetch,参数FetchOffset将被忽略(用0值) SQL_FETCH_PRIOR 滚动到上一行,参数FetchOffset将被忽略(用0值) SQL_FETCH_FIRST 滚动到第一行,参数FetchOffset将被忽略(用0值) SQL_FETCH_LAST 滚动到最后一行,参数FetchOffset将被忽略(用0值) SQL_FETCH_ABSOLUTE 滚动到参数FetchOffset指定的绝对行 SQL_FETCH_RELATIVE 由当前位置滚动到参数FetchOffset指定的相对行,FetchOffset大于0表示向前滚动,FetchOffset小于0表示向后滚动本文地址:http://com.8s8s.com/it/it23787.htm