一、使用ODBC API进行数据库编程的一般步骤
使用ODBC API进行数据库编程与使用一般WIN32 API编程非常类似,其中会大量使用到句柄这一数据结构。使用ODBC API进行数据库编程的一般步骤如下:
1.创建ODBC环境句柄
2.设置ODBC环境参数
3.创建ODBC连接句柄
4.设置ODBC连接属性
5.连接指定的ODBC数据源
6.创建ODBC语句句柄(statment handle)
7.设置ODBC语句句柄属性
8.使用语句句柄执行SQL命令(SQLExecute、SQLExecDirect)
9.绑定列并使用SQLFetch或者SQLFetchScroll获取每条记录的信息
10.重新执行步骤8
11.释放语句句柄
12.中断与数据源的连接
13.释放连接句柄和环境句柄
二、使用ODBC当中几个重要API函数的解释
1.SQLAllocHandle
SQLRETURN SQLAllocHandle ( SQLSMALLINT HandleType, // 需要申请的句柄类 SQLHANDLE InputHandle, // 输入句柄 SQLHANDLE *OutputHandlePtr);// 输出句柄,即在第一参数指定需要申请的句柄这个API函数用来分配ODBC句柄
参数1:用来指示要创建的句柄的类型,主要有
SQL_HANDLE_ENV 环境句柄
SQL_HANDLE_DBC 连接句柄
SQL_HANDLE_STMT 语句句柄
参数2:用来指示被创建句柄依据哪个句柄来创建,一般而言,创建环境句柄使用使用参数SQL_NULL_HANDLE,创建连接句柄的时候使用环境句柄作为依据,创建语句句柄的时候使用连接句柄作为依据
参数3:一个指向将要被创建句柄数据结构的指针
2.SQLFreeHandle
SQLRETURN SQLFreeHandle(SQLSMALLINT HandleType, //句柄类型
SQLHANDLE Handle) // 句柄功能:释放使用完毕的句柄
3.SQLConnect
SQLRETURN SQLConnectSQLHDBC 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)
用途:连接数据库
4.SQLFetch
SQLRETURN SQLFetch()
用途:获取结果集当中下一行当信息
返回值:如果为SQL_NO_DATA表示已经到达结果集底部,如果为SQL_SUCCESS表示成功
5.SQLFetchScroll
SQLReturn SQLFetchScroll(SQLHSTMT StatmentHandle, //语句句柄
SQLSMALLINT FetchOrientation //光标滚动方式
SQLSMALLINT FetchOffset) //滚动距离
关于参数二的说明,参数二一共可以设置以下几种值,并且某些值对参数3的取值有影响:
SQL_FETCH_NEXT 滚动到下一行,参数三的值被忽略
SQL_FETCH_PRIOR 滚动到上一行,参数三的值被忽略
SQL_FETCH_FIRST 滚动到第一行,参数三的值被忽略
SQL_FETCH_LAST 滚动到最后一行,参数三被忽略
SQL_FETCH_ABSLUTION 滚动到参数三所表示的绝对行,0表示第一行上一行,-1表示最后一行后一行
SQL_FETCH_RELATIVE 滚动到相对当前行FetchOffset的行,正表示向后负表示向前
在使用这个函数来获取相应的信息时,必须使用SQLSetStmtAttr函数来设置光标的类型,通过设置属性SQL_ATTR_CUSORTYPE可以实现这个功能。默认情况下光标的类型是SQL_CUSOR_FORWARD_ONLY,这是一种只能向前不能回退的光标类型,而要实现上面的所有功能必须使用SQL_CUSOR_STATIC或者SQL_CUSOR_DYNAMIC两种光标,前一种光标表示静态光标,这种光标表示其他用户对于数据源上数据的修改并不会反映到当前已获得的结果集当中除非重新获得结果集,而后者表示动态光标,这种光标可以将其他用户对数据源上数据的修改立即反映到当前结果集上。
另外在使用SQLFetch或者SQLFetchScroll函数获得结果集上信息之前应该先调用SQLBindCol函数来将变量与列绑定
执行某些SQL语句例如insert into table values(...)之类,我们需要使用程序当中的一些变量作为SQL语句的参数,在这种情况下我们可以把SQL语句改写成为insert into table values(?,?)其中?表示了参数,这种情况下我们可以用SQLPrepare函数来提交SQL语句,然后用SQLBindParemeters函数来绑定参数,在完成绑定以后调用SQLExcute函数来提交应用。
在所有的ODBC API函数的调用中我们可以看到都会返回一个SQLRETURN的值,这个值表示了该函数的执行结果,如果为SQL_SUCCESS表示执行成功,如果为SQL_SUCCESS_WITH_INFO表示执行成功但有警告信息,SQL_ERROR表示执行失败。在有警告信息或者执行失败的情况下我们可以调用SQLGetDiagRec来获取详细信息。
还有一些比较有用的ODBC API函数,例如SQLNumColCount可以获取结果集上的列数,SQLRowCount可以获取结果集上的行数等等,这些函数的具体参数可以参照MSDN上的解释使用
三、数据转换
由于ODBC在具体应用程序和DBMS当中充当一个中间层的角色因此必然存在一些数据类型的转换。C数据类型和ODBC数据类型的对应关系可以参考MSDN,并且在使用C/C++语言编写的ODBC应用程序当中建议使用ODBC定义的数据类型。