dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>C/C++技术资料>文章内容
利用VC++获取异构型数据库库结构信息
来源:不详     作者:    

一. 问题的提出
  随着数据库技术在各个应用领域的迅速发展,市场上推出了多种系统,为了
充分利用资源,实现信息共享,以便用户能对异构型实现透明的访问(包括数据查
询、更新和交换等功能),作者开发了异构型通信平台。在平台的研制过程中,获
取各种异构型的结构信息是进行数据访问的前提。作者以VC++5.0为开发语言,
利用ODBC实现了这一关键技术。
二. ODBC技术介绍
  ODBC技术是指开放性连接技术,该技术使应用程序无需关心数据源来自何
种DBMS,利用其标准实现与数据源之间的数据交换。传统的ODBC编程是利用高级
语言(如)调用ODBC的API来实现。应用程序要求驱动程序管理器和每个驱动程
序为ODBC环境、每个连接以及每个SQL语句分配信息存储空间,并返回指向各个存储
区的句柄供其调用。ODBC定义了三种句柄类型:
环境句柄:为全程信息标识内存存储,包括有效连接句柄及当前活动连接句柄。ODBC
将环境句柄定义为HENV类型的变量。应用程序使用单一环境句柄,它必须在连接到数
据源前请求该句柄。
  连接句柄:为特定连接的信息标识了内存存储。ODBC将连接句柄定义为HDBC类型。
应用程序必须在连接到数据源前请求连接句柄。每个连接句柄与环境句柄有关。然而,
环境句柄可以有多个与其有关的连接句柄。
语句句柄:为SQL语句信息标识内存存储。ODBC将语句句柄定义为HSTMT类型变量。应用
程序必须在提交SQL请求之前请求语句句柄。每个语句句柄与一个连接句柄有关。然而,
每个连接句柄可以有多个与其相关的语句句柄。
下面以为例说明传统ODBC编程的一般过程。
1、 环境申请,分配环境句柄
HENV henv;
SQLAllocEnv(&henv);
说明:分配一个环境句柄,支持一个或多个数据源连接。
2、 连接申请,分配连接句柄
HDBC hdbc;
SQLAllocConnect(henv,&hdbc);
说明:一个连接句柄对应一个数据源,可以有多个连接句柄。
3、 连接数据源,用连接句柄连接到数据源
SQLDriverConnect(hdbc,...);
说明:以对话框方式获取注册信息,并连接数据源。
4、 语句申请,分配语句句柄
SQLAllocStmt(hdbc,&hstmt);
说明:获得语句句柄,以便执行SQL语句。
5、 执行SQL语句
SQLExecDirect(hstmt,SQLStatement,..);
说明:利用语句句柄,执行SQL语句。
6、 释放所有资源
SQLfreeStemt(hstmst,...); //释放语句句柄
SQLDisconnect(hdbc); //断开连接
SQLFreeConnect(hdbc); //释放当前连接句柄
SQLFreeEnv(henv); //释放环境句柄
三. 利用V和ODBC技术获取异构型结构信息
传统的ODBC编程过程比较复杂,各种参数不易理解,且直接获取返回的数据较困难。
V 5.0的MFC类库对ODBC的API进行封装,部分简化了ODBC编程(尤其是对记
录集的操作),但单纯利用MFC类获取异构型的结构信息仍然比较困难,因此需
要将MFC和传统ODBC API编程结合起来。作者利用ODBC重载了MFC中CRecordset
类的部分成员,创建CTable和CColumns类。利用这两个新创建的类,可以很方便的获
取异构型结构信息。
下面就是关于CTable和Ccolumns类的定义:
class CTable : public CRecordset
  virtual CString GetDefaultConnect() { return ""; }
  virtual CString GetDefaultSQL() { return ""; }
public:
          CTable(CDatabase* pDatabase);
  BOOL       Open(LPCSTR pszTableQualifier = NULL,
            LPCSTR pszTableOwner = NULL,
            LPCSTR pszTableName = NULL,
            LPCSTR pszTableType = NULL,
            UINT nOpenType = forwardOnly);
  CString       m_strTableQualifier;
  CString       m_strTableOwner;
  CString       m_strTableName;
  CString       m_strTableType;
  CString       m_strRemarks;
  virtual void  DoFieldExchange(CFieldExchange*);
};
class CColumns : public CRecordset
  virtual CString GetDefaultConnect() { return ""; }
  virtual CString GetDefaultSQL() { return ""; }
public:
          CColumns(CDatabase* pDatabase);
  BOOL       Open(LPCSTR pszTableQualifier = NULL,
            LPCSTR pszTableOwner = NULL,
            LPCSTR pszTableName = NULL,
            LPCSTR pszColumnName = NULL,
            UINT nOpenType = forwardOnly);
  CString       m_strTableQualifier;
  CString       m_strTableOwner;
  CString       m_strTableName;
  CString       m_strColumnName;
  int         m_nDataType;
  CString       m_strTypeName;
  long       m_nPrecision;
  long       m_nLength;
  int         m_nScale;
  int         m_nRadix;
  int         m_fNullable;
  CString       m_strRemarks;
  virtual void  DoFieldExchange(CFieldExchange*);
};
BOOL CColumns::Open(LPCSTR pszTableQualifier,
  LPCSTR pszTableOwner,LPCSTR pszTableName,LPCSTR pszColumnName,
  UINT nOpenType)
  RETCODE  nRetCode;
  UWORD  bFunctionExists;
  //检验是否支持SQLColumns
  AFX_SQL_SYNC(::SQLGetFunctions(m_pDatabase->m_hdbc,
    SQL_API_SQLCOLUMNS,&bFunctionExists));
  if (!Check(nRetCode) || !bFunctionExists)
  {
    if (!bFunctionExists)
      TRACE(_T("SQLColumns 不支持\n"));
    return FALSE;
  }
  //设置缓冲区状态,分配语句句柄
  SetState(nOpenType,NULL,readOnly);
  if (!AllocHstmt())
    return FALSE;
  TRY
  {
    OnSetOptions(m_hstmt);
    AllocStatusArrays();
    // 调用ODBC的SQLColumns
    AFX_ODBC_CALL(::SQLColumns(m_hstmt,
      (UCHAR FAR*)pszTableQualifier,SQL_NTS,
      (UCHAR FAR*)pszTableOwner,SQL_NTS,
      (UCHAR FAR*)pszTableName,SQL_NTS,
      (UCHAR FAR*)pszColumnName,SQL_NTS));
    if (!Check(nRetCode))
      ThrowDBException(nRetCode,m_hstmt);
    // 分配内存,填写信息
    AllocAndCacheFieldInfo();
    AllocRowset();
    MoveNext();
    m_bBOF = m_bEOF;
  }

[1]  

 

 

上一篇:给你的应用程序添加动态鼠标   下一篇:VC++:访问和修改系统注册表
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言数组排序小结
·Python 与 C++ 程序的简单实例对
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
·C++初学者应该关心的优秀图书一
·利用C语言小程序来解决大问题
·用C语言写PHP扩展的步骤
·用C语言扩展PHP功能
  相关文章
·给你的应用程序添加动态鼠标
·VC++:访问和修改系统注册表
·VC中多语菜单的实现
·InstallShiled 中文字体安装工具
·VC++任务栏提示区图标的实现
·一个简单的SOAP服务应用
·VC++动态加入和删除菜单的方法
·用VC++6.0编写Proxy服务器
·VC++环境下菜单和工具栏的动态修
·DirectDraw 游戏编程基础(3)
·用VC设计自动循环MP3播放器
·一个Socket传输文件的例子
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763