ODBC API访问数据库

---- 开放数据库互连(ODBC)已经成为Client/Server数据库应用系统中访问远程数据库的一个标准。做为强大的前端开发工具,MS Visual Basic为开发者提供了多种访问ODBC数据源的途径,如JET数据库引擎、ODBC API函数、RDO接口等。比较而言,直接使用ODBC API函数的编程难度最大,但由此获得的存取数据库的性能也是最佳。诚然,VB 4.0企业版提供的RDO接口的性能已经接近ODBC API,但是遗憾的是,这个接口只能在32位Windows环境中运行, 而ODBC API函数则没有这个限制。

---- ODBC API函数的声明方法

---- 与使用其它动态库函数一样,在VB中使用ODBC API函数之前,必须事先声明将要使用的函数、常量和数据结构。ODBC API函数驻留在ODBC运行动态库ODBC.DLL(16位)或ODBC32.DLL(32 位)中,该动态库位于Windows子目录system中。通常做法是在VB项目中单独使用一个模块文件,然后将ODBC API声明语句加入其中,如下所示,就是本文实例中使用的模块文件module1.bas的内容:

Declare Function SQLAllocEnv Lib "
odbc32.dll" (phenv&) As Integer
Declare Function SQLAllocConnect Lib "
odbc32.dll" (ByVal henv&, phdbc&) As Integer
Declare Function SQLAllocStmt Lib "
odbc32.dll" (ByVal hdbc&, phstmt&) As Integer
Declare Function SQLConnect Lib "
odbc32.dll" (ByVal hdbc&, ByVal szDSN$,
ByVal cbDSN%, ByVal szUID$, ByVal cbUID%,
ByVal szAuthStr$, ByVal cbAuthStr%) As Integer
Declare Function SQLColAttributesString Lib "
odbc32.dll" Alias "SQLColAttributes"
(ByVal hstmt&, ByVal icol%, ByVal fDescType%,
ByVal rgbDesc As String, ByVal cbDescMax%,
pcbDesc%, pfDesc&) As Integer
Declare Function SQLDisconnect Lib "
odbc32.dll" (ByVal hdbc&) As Integer
Declare Function SQLExecDirect Lib "
odbc32.dll" (ByVal hstmt&, ByVal
szSqlStr$, ByVal cbSqlStr&) As Integer
Declare Function SQLFetch Lib "
odbc32.dll" (ByVal hstmt&) As Integer
Declare Function SQLFreeConnect Lib "
odbc32.dll" (ByVal hdbc&) As Integer
Declare Function SQLFreeEnv Lib "
odbc32.dll" (ByVal henv&) As Integer
Declare Function SQLFreeStmt Lib "
odbc32.dll" (ByVal hstmt&, ByVal fOption%) As Integer
Declare Function SQLGetData Lib "
odbc32.dll" (ByVal hstmt&, ByVal icol%,
ByVal fCType%, ByVal rgbValue As String,
ByVal cbValueMax&, pcbValue&) As Integer
Declare Function SQLNumResultCols Lib "
odbc32.dll" (ByVal hstmt&, pccol%) As Integer
Global Const SQL_C_CHAR As Long = 1
Global Const SQL_COLUMN_LABEL As Long = 18
Global Const SQL_DROP As Long = 1
Global Const SQL_ERROR As Long = -1
Global Const SQL_NO_DATA_FOUND As Long = 100
Global Const SQL_SUCCESS As Long = 0

---- 需要说明的是,在函数声明时,应该根据程序的运行环境选择相应的动态库。在VB子目 录samples/remauto/db_odbc中有两个正文文件ODBC16.TXT和ODBC32.TXT,分别存有所有16位和32位ODBC API函数、常量和数据结构的声明语句,编程时可以从中拷贝所需的声明语句。

---- 使用ODBC API的编程方法

---- 在VB中调用ODBC API函数访问ODBC数据库,代码编制一般是按照下列过程进行的:

---- 一、初始化ODBC

---- 在这个过程中,应用程序将通过调用SQLAlloEnv函数初始化ODBC接口,获取ODBC环境句柄。ODBC环境句柄是其它所有ODBC资源句柄的父句柄,因此无论程序将建立多少个ODBC连接,这个过程只需执行一次即可。例如:

Dim rc As Integer 'ODBC函数的返回码
Dim henv As Long 'ODBC环境句柄
rc = SQLAllocEnv(henv) '获取ODBC环境句柄

---- 二、 与ODBC数据源建立连接

---- 这个过程由下列两个步骤组成:
---- 1、 调用SQLAllocConnect函数获取连接句柄。例如:

Dim hdbc As Long '连接句柄
rc = SQLAllocConnect(henv, hdbc) '获取连接句柄

---- 2、建立连接。这个步骤可以通过多种方法实现,最简单直观的方法是调用SQLConnect函数。例如:

Dim DSN As String, UID As String, PWD As String
DSN = "DataSourceName" 'ODBC数据源名称
UID = "UserID" '用户帐号
PWD = "Password" '用户口令
rc = SQLConnect(hdbc, DSN, Len(DSN), UID,
Len(UID), PWD, Len(PWD)) '建立连接

---- 三、 存取数据

---- 用户对ODBC数据源的存取操作,都是通过SQL语句实现的。在这个过程中,应用程序将通过连接向ODBC数据库提交SQL语句,以完成用户请求的操作。具体步骤如下:
---- 1、调用SQLAllocStmt函数获取语句句柄。例如:

Dim hstmt As Long
rc = SQLAllocStmt(hdbc, hstmt)

---- 2、执行SQL语句。执行SQL语句的方法比较多,最简单明了的方法是调用SQLAllocStmt函数,例如:

Dim SQLstmt As String
SQLstmt = "SELECT * FROM authors"
rc = SQLExecDirect(hstmt, SQLstmt, Len(SQLstmt))

---- 四、检索结果集

---- 如果SQL语句被顺利提交并正确执行,那么就会产生一个结果集。检索结果集的方法有很多,最简单最直接的方法是调用SQLFetch和SQLGetData 函数。SQLFetch 函数的功能是将结果集的当前记录指针移至下一个记录,SQLGetData 函数的功能是提取结果集中当前记录的某个字段值。通常可以采用一个循环以提取结果集中所有记录的所有字段值,该循环重复执行SQLFetch和SQLGetData函数,直至SQLFetch函数返回SQL_NO_DATA_FOUND,这表示已经 到达结果集的末尾。

Dim ColVal As String * 225
ColVal = String(255, 0)
Do Until SQLFetch(hstmt) = SQL_NO_DATA_FOUND
rc = SQLGetData(hstmt, i, SQL_C_CHAR, ColVal,
Len(ColVal), SQL_NULL_DATA)
Loop

---- 五、结束应用程序

---- 在应用程序完成数据库操作,退出运行之前,必须释放程序中使用的系统资源。这些系统资源包括:语句 句柄、连接句柄和ODBC环境句柄。完成这个过程的步骤如下:

---- 1、 调 用SQLFreeStmt 函数释放语句句柄及其相关的系统资源。例如:

rc = SQLFreeStmt(hstmt, SQL_DROP)

---- 2、 调 用SQLDisconnect 函数关闭连接。例如:

rc = SQLDisconnect(hdbc)

---- 3、 调 用SQLFreeConnect 函数释放连接句柄及其相关的系统资源。例如:

rc = SQLFreeConnect(hdbc)

---- 4、 调 用SQLFreeEnv函数释放环境句柄及其相关的系统资源,停止ODBC操作。例如:

rc = SQLFreeEnv(henv)

---- 此外,在编制程序时还有一个需要重点考虑的问题,这就是错误处理。所有ODBC API函数,若在执行期间发生错误,都将返回一个标准错误代码SQL_ERROR。一般来讲,在每次调用ODBC API函数之后,都应该检查该函数返回 值,确定该函数是否成功地执行,再决定是否继续后续过程。而详细的错误信息,可以调用SQLError函数获 得。SQLError函数将返回下列信息:标准的ODBC错误状态码

ODBC数据源提供的内部错误编码

错误信息串
---- 简单应用实例
---- 本实例将编制一个客户机端VB应用程序,通过Windows NT局域网查询服务器端MS SQL Server 6.5样板数据库PUBS中 的AUTHORS数据表,并在一个Grid控件中显示查询结果。首先,使用Windows控制面板中的ODBC驱动管理器新建一 个ODBC数据源,定义数据源名称为ODBC_API_DEMO,定义登录数据库为PUBS,其它信息应根据用户的环境正确设置。 然后,启动VB,新建一个项目Project1,在缺省窗体Form1中加入一个Grid控件Grid1、两个CommandButton控件cmdQuery 和cmdClose,在Project1中插入一个模块Module1,将前面列举的声明语句加入其中。程序代码如下:

Private Sub Form_Load()
Dim rc As Integer
rc = SQLAllocEnv(henv)
If rc 0 Then
MsgBox "无法初始化ODBC"
End
End If
rc = SQLAllocConnect(henv, hdbc)
If rc 0 Then
MsgBox "无法获得连接句柄"
rc = SQLFreeEnv(henv)
End
End If
Dim DSN As String, UID As String, PWD As String
DSN = "ODBC_API_DEMO"
UID = "guest"
PWD = ""
rc = SQLConnect(hdbc, DSN, Len(DSN),
UID, Len(UID), PWD, Len(UID))
If rc = SQL_ERROR Then
MsgBox "无法建立与ODBC数据源的连接"
End
End If
End Sub
Private Sub cmdQuery_Click()
Dim hstmt As Long
Dim SQLstmt As String
Dim RSCols As Integer, RSRows As Long
Dim rc As Integer, i As Integer, j As Integer
Dim ColVal As String * 1024
Dim ColValLen As Long, ColLabLen As Integer, larg As Long
rc = SQLAllocStmt(hdbc, hstmt)
If rc SQL_SUCCESS Then
MsgBox "无法获得SQL语句句柄"
Exit Sub
End If
SQLstmt = "SELECT * FROM authors"
rc = SQLExecDirect(hstmt, SQLstmt, Len(SQLstmt))
If rc SQL_SUCCESS Then
MsgBox "SQL语句执行失败"
Exit Sub
End If
rc = SQLNumResultCols(hstmt, RSCols)
If RSCols > 1 Then
Grid1.Cols = RSCols
Grid1.Rows = 10
Grid1.Row = 0
Else
Exit Sub
End If
For i = 1 To RSCols
rc = SQLColAttributesString(hstmt, i,
SQL_COLUMN_LABEL, ColVal, 255, ColLabLen, larg)
Grid1.Col = i - 1
Grid1.Text = Left(ColVal, ColLabLen)
Next i
Do Until SQLFetch(hstmt) = SQL_NO_DATA_FOUND
ColVal = String$(1024, 0)
If Grid1.Row + 1 >= Grid1.Rows Then
Grid1.Rows = Grid1.Rows + 1
End If
Grid1.Row = Grid1.Row + 1
For i = 1 To RSCols
rc = SQLGetData(hstmt, i, SQL_C_CHAR,
ColVal, Len(ColVal), ColValLen)
Grid1.Col = i - 1
Grid1.Text = Left$(ColVal, ColValLen)
Next i
Loop
rc = SQLFreeStmt(hstmt, SQL_DROP)
End Sub
Private Sub cmdClose_Click()
Dim rc As Integer
If hdbc 0 Then
rc = SQLDisconnect(hdbc)
End If
rc = SQLFreeConnect(hdbc)
If henv 0 Then
rc = SQLFreeEnv(henv)
End If
End
End Sub

---- 实例程序是使用Visual Basic 4.0在Windows 95环境下开发的。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值