-
vb.net教程之使用ODBC API访问数据库
为了存取ODBC数据源,应用程序应该包含以下的步骤:
1.连接ODBC数据源
要求给定ODBC数据源名称以及其他一些必要的信息。
在应用程序调用ODBC函数之前,必须初始化ODB接口,建立一个环境句柄。首先声明一个环境句柄变量,如:
Dim hEnv1 as Long
如果使用的是ODBC 2.X,那么调用函数SQLAllocEnv,并把环境变量以引用传递的方式传给该函数。驱动程序管理器将初始化ODBC环境,为环境句柄分配存储空间,并返回一个环境句柄,如:
SQLAllocEnv(hEvn1)
如果使用的是ODBC 3.X,那么参数SQL_NULL_EVN调用函数SQLAllocHandle,如:
SQLAllocHandle (SQL_HANDLE_ENV,SQL_NULL_HANDLE,hEnv1)
以上步骤在一个应用程序中只能进行一次。但在一个ODBC环境中可以连接多个数据源。下面就来看如何连接数据源。
在连接数据源之前,应用程序先分配一个或多个连接句柄。首先声明一个连接句柄变量,如:
Dimn hDbc1 as Long
如果使用的是ODBC 2.x,那么调用函数SQLAllocConnect,并把连接句柄变量以引用传递的方式传给该函数。驱动程序管理器为该连接分配一块储存空间,并返回一个连接句柄,如:
SQLAllocConnect(hEnv1,hDbc1)
如果使用的是ODBC 3.x,那么用参数SQL_HANDLE_DBC和环境句柄来调用函数SQLAllocHandle,如:
SQLAllocHandle(SQL_HANDLE_DBC,hEnv1,hDbc1)
现在就可以指定驱动程序和数据源了,并且用函数SQLDriverConnect来连接指定的数据源。如:
2.处理SQL语句
(1)应用程序把SQL语句字符串放入一个缓冲区。如果这个SQL语句含有参数,还应该设置参数值。
(2)如果SQL语句返回一个结果集,还要为该语句早班一个游标名。
(3)应用程序以“准备”或“立即执行”的方式提交SQL语句。
(4)如果SQL语句建立一组结果集,应用程序可以查询结果的属性,例如列数、列的数据类型等。为每一列连接一个缓冲并提取结果。
(5)如果SQL语句产生错误,则提取错误信息并采取相应的措施。
在处理SQL语句之前,首先必须分配一个语句句柄。先声明一个语句句柄变量,如:
Dim hStmtl as ling
如果使用是的ODBC 2.X,那么调用函数SQLAllocStmt,如:
SQLAllocStmt1(hDbc1,hStmt1)
如果使用的是ODBC 3.X,那么用参数SQL_HANDLE_STMT和参数hDbc1调用函数SQLAllocHandle,如:
SQLAllocHandle(SQL_HANDLE_STMT,hDbc1,hstmt1)
接下来就可以执行SQL语句了,如果采用“准备”方式执行sql语句,应用程序要做如下步骤:
(1)调用SQLPrepare函数准备一个SQL语句,把SQL语句作为函数的一个参数,例如:
SQLPrepare(hStmt1,"Select Name,Age From Employee Where AGE=?",SQL_NTS)。
(2)设置SQL语句中的参数值。如果SQL语句中出现了问号(?),那么表明这个SQL语句是带参数的,如:
SQLBindParameter(hStmt1,1,SQL_Param_INPUT),
SQL_C_Clong.SQL_INTEGER,0,0,age,0 name,vbNull).
这样每次查询后,Name字段值就存放在变量name中。
(3)调用函数SQLExecute来执行SQL语句。如:SQLExecute(hStmt1)
(4)提取查询结果.这个任务由函数SQLFetch来完成,如SQLFetch(hStmt1).
(5)根据程序需要,可有选择地进行这五个步骤.
如果是采用"立即执行"方式执行SQL语句,那么省去上面的第一步,在执行SQL语句时,用函数SQLExecuteDirect.如:
但是就速度而言,"准备"方式比"立即执行"方式要快,因此,只在下面情况下,考虑使用"立即执行"方式:
(1)应用程序的SQL语句只执行一次;
(2)应用程序在执行前不需要查询有关结果信息.
3.结束事务
可以提交事务,也可以撤销事务。有两种提交事务的模式:一种是自动模式,另一种是手动模式。
在自动模式下,每个SQL语句都被认为成一个完整的事务而自动提交。在手动模式下,事务由一个或几个SQL语句组成,如果应用程序提交一个SQL语句时没有活动事务,驱动程序就建立一个新的事务,在后续的SQL语句提交过程中,驱动程序保持这个处于活动的事务,直到应用程序调用函数SQLTransact(ODBC2.X)或SQLENDTRAN(ODBC 3.X)进行事务提交或撤消。
如果驱动程序支持SQL_AUTOCOMMIT连接选项,则缺省的事务模式是自动提交模式;如果不支持SQL_AUTOCOMMIT连接选项,则缺省的事务模式是手动模式。应用程序可以调用函数SQLSetConnectOption(ODBC2.X)或SQLSetconnectAttr(ODBC3.X)进行自动/手动提交模式切换。在进行模式交换时,驱动程序将自动提交当前连接中的所有活动事务。
应用程序应该用函数SQLTransact或SQLEndTrans来处理事务,而不要用SQL语句中的COMMIT或ROLLBACK来处理事务,COMMIT或ROLLBACK语句的结果取决于驱动程序及相连接的数据源。
注意:不管是用自动模式还是用手动模式处理事务,也不管是提交事务还是撤销事务,只要是事务处理都将引起数据源关闭游标并删除与该数据源有关的所有存储计划。
4.中断连接
在完成对数据库的存取后,中断与数据源的连接。
用函数SQLDisconnect来中断与数据源的连接。例如,下面的语句中断连接句柄hDbc1所指的数据源连接。
SQLDisconnect(hDbc1)
在中断连接后,必须释放所有的句柄,包含语句句柄、连接句柄和环境句柄。
当使用ODBC2.X时:
(1)释放语句句柄,用函数SQLFreestmt,如SQL_DROP;
(2)释放连接句柄,用函数SQLFreeConnect,如SQLFreeConnect(hDbc1);
(3)释放环境句柄,用函数SQLFreeEnv,如SQLFreeEnv(hEnv1)。
当使用ODBC3.XJF ,释放连接句柄和环境都用函数SQLFreeHandle,只不过带的参数不同。当释放连接句柄时,用参数SQL_HANDLE_DBC;当释放环境句柄时,用参数SQL_HANDLE_ENV。如果释放语句句柄时用SQL_DROP,那么,也使用SQLFreeHandle函数,参数改为SQL_HANDLE_STMT,否则和ODBC2.XG一样使用SQLFreeStmt.