ODBC API常用函數詮釋

 
  ODBC API是一套複雜的函數集,可提供一些通用的接口,以便訪問各種後臺數據庫。本文詳細介紹了ODBC API的常用十四個函數並列出在PowerBuilder中外部函數引用聲明。
<script> document.write('
//-->

  以下爲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)
發佈了4 篇原創文章 · 獲贊 3 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章