odbc api常用函数诠释
记得kony曾经在我的这个坛子上转过一个帖子,解释使用odbc数据源来连接数据库进行数据库操作速度慢的原因,同时那个帖子也提出了提高odbc数据源连接数据库进行数据库操作速度的两个办法,一个是利用visiual basic中的rdo组件,一个就是直接调用odbc api函数进行相关数据库操作,应答应过这里的弟弟妹妹们写点关于odbc api函数方面的东东,所以只能赶鸭子上架了;
以下为odbc api的常用十四个函数,先列出在powerbuilder中外部函数引用声明:
function integer sqlallocenv(ref long phenv) library “odbc32.dll”
function integer sqlfreeenv(long henv) library “odbc32.dll”
function integer sqldatasources(long henv,int fdirection,ref string szdsn,&
integer cbdsnmax,ref integer pcbdsn,ref string szdescription,integer cbdescriptionmax,ref integer pcbdescription)library “odbc32.dll”
function integer sqlallocconnect(long henv,ref long hdbc)library “odbc32.dll”
function integer sqlconnect (long hstmt,ref string szdsn,integer dsnlen,ref string
szuid,integer uidlen,ref string szpwd,integer pwdlen) library “odbc32.dll”
function integer sqldisconnect (long hdbc) library “odbc32.dll”
function integer sqlallocstmt(long hdbc,ref long hstmt)library “odbc32.dll”
function integer sqltables(long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,integer namelen,
ref string sztype,integer typelen)library “odbc32.dll”
function integer sqlcolumns(long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,integer namelen,
ref string sztype,integer typelen)library “odbc32.dll”
function integer sqlbindcol(long hstmt,integer colnum,integer datatype,ref string name,long maxlen,ref long actlen) library “odbc32.dll”
function integer sqlfetch(long hstmt)library “odbc32.dll”
function integer sqlerror(long lenv,long hdbc,long hstmt,ref string sqlstate,ref long nativeerror,ref string errormsg,integer errormsgmax,ref integer errormsglen)library “odbc32.dll”
function integer sqlfreestmt(long hstmt,integer options)library “odbc32.dll”
1、function integer sqlallocenv(ref long phenv) library “odbc32.dll”
参数:ref long phenv 引用传递的long类型参数,保存该函数返回的obdc环境的句柄。
存放在phenv中的值成为以后obdc api函数调用的唯一标识符。
返回值:integer 成功时,返回0,失败返回值小于0。
函数功能:获取odbc环境句柄。
2、function integer sqlallocstmt(long hdbc,ref long hstmt)library “odbc32.dll”
参数:long hdbc odbc环境的句柄。
ref long hstmt 保存sql语句句柄。
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:获取sql语句句柄。
3、function integer sqlconnect (long hstmt,ref string szdsn,integer dsnlen,ref string szuid,integer uidlen,
ref string szpwd,integer pwdlen) library “odbc32.dll”
参数:long hstmt ,调用sqlallocstmt()函数获取的句柄。
ref string szdsn,odbc数据源名。
integer dsnlen ,odbc 数据源名的长度。
ref string szuid ,用户帐号。
integer uidlen ,用户帐号长度。
ref string szpwd ,用户口令。
ref integer pwdlen,用户口令长度。
返回值:integer ,成功时,返回值大于0,失败返回值小于0。
函数功能:连接odbc数据源,并返回连接句柄。
4、 function integer sqldisconnect (long hdbc) library “odbc32.dll”
参数:long hdbc 连接句柄。
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:断开连接odbc数据源。
5、 function integer sqltables(long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,integer namelen,ref string sztype,integer typelen)library “odbc32.dll”
参数:long hstmt sql语句句柄
ref string sztablequalifier 表的qualifier名。
integer tablequalifierlen 表的qualifier名的长度。
ref string szowner 表的所有者名。
integer owerlen 表的所有者名长度。
ref string szname 表名。
integer namelen 表名长度。
ref string sztype 表的类型名。
integer typelen 表的类型名长度。
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:获取表的信息。
6、 function integer sqlcolumns(long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,integer namelen, ref string sztype,integer typelen)library “odbc32.dll”
参数:long hstmt sql语句句柄
ref string sztablequalifier 表的qualifier名。
integer tablequalifierlen 表的qualifier名的长度。
ref string szowner 表的所有者名。
integer owerlen 表的所有者名长度。
ref string szname 表名。
integer namelen 表名长度。
ref string sztype 表的类型名。
integer typelen 表的类型名长度。
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:获取指定表的列信息。
7、function integer sqlbindcol(long hstmt,integer colnum,integer datatype,ref string name,long maxlen,
ref long actlen) library “odbc32.dll”
参数:long hstmt sql语句句柄
integer colnum 1-5(是否有资格,拥有者名字、类型、注释)。
integer datatype 1-8,12,99。
ref string name 程序字符串变量。
long maxlen 可变。
ref long actlen 可变。
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:绑定结果集。
8、function integer sqlfetch(long hstmt)library “odbc32.dll”
参数:long hstmt sql语句句柄
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:绑定结果集。
9、function integer sqlerror(long lenv,long hdbc,long hstmt,ref string sqlstate,ref long nativeerror,ref string errormsg,integer errormsgmax,ref integer errormsglen)library “odbc32.dll”
参数:long lenv odbc 环境句柄
long hdbc 连接句柄
long hstmt sql语句句柄
ref string sqlstate 用于接受包含sql错误标识的字符串
ref long nativeerror用于接受包含sql错误标识码
ref string errormsg用于接受包含sql错误信息的字符串
integer errormsgmax 函数返回的最多字符数
ref integer errormsglen函数返回的实际字符数
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:返回调用odbc api函数错误。
10、function integer sqlfreeenv(long henv) library “odbc32.dll”
参数:long lenv odbc 环境句柄
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:释放odbc环境句柄。
11、function integer sqlfreestmt(long hstmt,integer options)library “odbc32.dll”
参数:long hstmt sql语句句柄。
integer options 相关选项。
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:释放sql语句句柄。
12、function integer sqldatasources(long henv,int fdirection,ref string szdsn, integer cbdsnmax,ref integer pcbdsn,ref string szdescription,integer cbdescriptionmax,ref integer pcbdescription)library “odbc32.dll”
参数:long henv odbc数据源环境句柄。
int fdirection 方向标志 1(下一个),2(第一个),3(最后一个),4(前一个)
ref string szdsn 数据源名称
integer cbdsnmax数据源名称的最大长度
ref integer pcbdsn数据源名称的实际长度
ref string szdescription 数据源描述名称
integer cbdescriptionmax 数据源描述字符串的最大长度
ref integer pcbdescription数据源描述字符串的实际长度
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:释放sql语句句柄。
13、function integer sqlallocconnect(long henv,ref long hdbc)library “odbc32.dll”
参数:long henv odbc数据源环境句柄。
ref long hdbc 保存odbc连接句柄。
返回值:integer ,成功时,返回0,失败返回值小于0。
函数功能:获取odbc连接句柄。
-:)上面总算将列出的几个odbc api函数描述完,等有时间结合具体例子来说明如何利用odbc api函数访问数据库了-:)
例程:
定义实例变量:
protected:
long henv//sql 环境句柄
long hstmt//sql语句句柄
long hdbc//sql 连接句柄
定义句柄外部函数引用:
function integer sqlallocenv(ref long phenv) library “odbc32.dll”
function integer sqlfreeenv(long henv) library “odbc32.dll”
function integer sqldatasources(long henv,int fdirection,ref string szdsn,&
integer cbdsnmax,ref integer pcbdsn,ref string szdescription,integer cbdescriptionmax,ref integer pcbdescription)library “odbc32.dll”
function integer sqlallocconnect(long henv,ref long hdbc)library “odbc32.dll”
function integer sqlconnect (long hstmt,ref string szdsn,integer dsnlen,ref string
szuid,integer uidlen,ref string szpwd,integer pwdlen) library “odbc32.dll”
function integer sqldisconnect (long hdbc) library “odbc32.dll”
function integer sqlallocstmt(long hdbc,ref long hstmt)library “odbc32.dll”
function integer sqltables(long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,integer namelen,
ref string sztype,integer typelen)library “odbc32.dll”
function integer sqlcolumns(long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,integer namelen,
ref string sztype,integer typelen)library “odbc32.dll”
function integer sqlbindcol(long hstmt,integer colnum,integer datatype,ref string name,long maxlen,ref long actlen) library “odbc32.dll”
function integer sqlfetch(long hstmt)library “odbc32.dll”
function integer sqlerror(long lenv,long hdbc,long hstmt,ref string sqlstate,ref long nativeerror,ref string errormsg,integer errormsgmax,ref integer errormsglen)library “odbc32.dll”
function integer sqlfreestmt(long hstmt,integer options)library “odbc32.dll”
声明一个函数wf_sqlerror()
代码如下:
string ls_sqlstate,ls_errormsg
integer li_errormsgmax,li_ret
long nativeerror
ls_errormsg=space(255)
ls_sqlstate=space(255)
li_ret=sqlerror(henv,hdbc,hstmt,ls_sqlstate,li_nativeerror,ls_errormsg,255,li_errormsgmax)
messagebox(“odbc:”+ls_sqlstate,ls_errormsg)
return
窗口的open 事件,写入如下代码:
string ls_dsn,ls_description
integer li_direction,li_dsnmax,li_dsn_len
integer li_descriptionmax,li_description_len,li_retval
ls_dsn=space(255)
li_dsnmax=len(li_dsn)
ls_description=space(255)
li_descriptionmax=len(ls_description)
if sqlallocenv(henv)=-1 then
wf_sqlerror()
else
li_driection=1
do while sqldatasources(henv,li_direction,ls_dsn,li_dsnmax,li_dsn_len,ls_description,li_descriptionmax,li_description_len)=0
lb_datasources.additem(ls_dsn0
loop
end if
窗口的close事件中写入如下代码:
sqldisconnect(hdbc)
sqlfreeenv(henv)
在cb_connect按钮的cliked事件中写入如下的代码:
integer li_ret
string ls_dsn,ls_uid,ls_pwd
string ls_qualifer,ls_owner,ls_name,ls_type,ls_table
long ll_len
ls_dsn=lb_datasources.selecteditem()
ls_uid=sle_uid.text
ls_pwd=sle_pwd.text
li_ret=sqlallocconnect(henv,hdbc)
if li_ret<0 then
wf_sqlerror()
else
li_ret=sqlconnect(hdbc,ls_dsn,len(ls_dsn),ls_uid,len(ls_uid),ls_pwd,len(ls_pwd))
if li_ret<0 then
wf_sqlerror()
else
li_ret=sqlallocstmt(hdbc,hstmt)
if li_ret<0 then
wf_sqlerror()
else
ls_type=”table,view”
if cbx_systemtables.checked then
ls_type=ls_type+”,system table “
end if
li_ret=sqltables(hstmt,ls_qualifier,len(ls_qualifier),ls_owner,len(ls_owner),ls_name,len(ls_name),ls_type,len(ls_type))
if li_ret<0 then
wf_sqlerror()
else
ls_table=space(255)
ll_len=255
sqlbincol(hstmt,3,1,ls_table,ll_len,ll_en)
lb_tables.setredraw(false)
do while sqlfetch(hstmt)=0
lb_tables.additem(ls_table)
loop
lb_tables.setredraw(true)
li_ret=sqlfreestmt(hstmt,0)
end if
end if
end if
end if
this.enabled=false
this.default=false
cbx_systemtables.enabled=false
在lb_datasources的selectionchanged事件中写入如下代码:
sle_uid.text=””
sle_pwd.text=””
sqldisconnect(hdbc)
cbx_systemtables.enabled=true
cb_connect.enabled=true
lb_columns.reset()
lb_tables.reset()
sle_uid.setfocus()
cb_connect.default=true
在lb_tables的selectionchanged事件中写入如下代码:
integer li_ret,li_len
string ls_qualifier,ls_owner,ls_name,ls_column,ls_colname,ls_type
long ll_maxlen
lb_columns.reset()
ls_qualifier=space(255)
ls_owner=space(255)
ls_column=space(255)
ls_colname=space(255)
ls_type=space(255)
ls_name=space(255)
ls_name=this.selecteditem()
li_ret=sqlcolumns(hstmt,ls_quanlifier,0,ls_owner,0,ls_name,len(ls_name),ls_column,0)
if li_ret<0 then
wf_sqlerror()
else
ls_colname=space(255)
ls_type=space(255)
ll_maxlen=255
sqlbindcol(hstmt,4,1,ls_colname,ll_maxlen,ll_maxlen)
sqlbindcol(hstmt,6,1,ls_type,ll_maxlen,ll_maxlen)
lb_columns.setredraw(false)
do while sqlfetch(hstmt)=0
lb_columns.additem(ls_colname+”~t”+ls_type)
loop
lb_columns.setredraw(true)
li_ret=sqlfreestmt(hstmt,0)
end if
在按钮cb_exit的clicked事件中写入以下代码:
close(parent)
在应用对象的open事件中写入以下代码:
open(w_odbc_data_sources)