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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章