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 szd
您正在看的Sybase教程是:ODBC API常用函數诠釋。sn,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
您正在看的Sybase教程是:ODBC API常用函數诠釋。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函數訪問數據庫了-:
[NextPage]
例程:
定義實例變量:
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,inte
您正在看的Sybase教程是:ODBC API常用函數诠釋。ger 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=SQL
您正在看的Sybase教程是:ODBC API常用函數诠釋。TABLES(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() <BR>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)