利用VC--获取异构型数据库库结构信息.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 VC 获取 构型 数据库 结构 信息
- 资源描述:
-
利用VC++获取异构型数据库库结构信息 摘 要:本文在介绍ODBC技术的基础上,将MFC和ODBC API结合起来创建了两个自定义 类, 实现了对任意异构型数据库库结构信息的获取。 关键字:ODBC,MFC,异构型数据库,记录集 一. 问题的提出 随着数据库技术在各个应用领域的迅速发展,市场上推出了多种数据库系统,为了充分利用资源,实现信息共享,以便用户能对异构型数据库实现透明的访问(包括数据查询、更新和交换等功能),作者开发了异构型数据库通信平台。在平台的研制过程中,获取各种异构型数据库的结构信息是进行数据访问的前提。作者以VC++5.0为开发语言,利用ODBC实现了这一关键技术。 二. ODBC技术介绍 ODBC技术是指开放性数据库连接技术,该技术使应用程序无需关心数据源来自何种DBMS,利用其标准接口实现与数据源之间的数据交换。传统的ODBC编程是利用高级语言(如C语言)调用ODBC的API来实现。应用程序要求驱动程序管理器和每个驱动程序为ODBC环境、每个连接以及每个SQL语句分配信息存储空间,并返回指向各个存储区的句柄供其调用。ODBC接口定义了三种句柄类型: 环境句柄:为全程信息标识内存存储,包括有效连接句柄及当前活动连接句柄。ODBC将环境句柄定义为HENV类型的变量。应用程序使用单一环境句柄,它必须在连接到数据源前请求该句柄。 连接句柄:为特定连接的信息标识了内存存储。ODBC将连接句柄定义为HDBC类型。应用程序必须在连接到数据源前请求连接句柄。每个连接句柄与环境句柄有关。然而,环境句柄可以有多个与其有关的连接句柄。 语句句柄:为SQL语句信息标识内存存储。ODBC将语句句柄定义为HSTMT类型变量。应用程序必须在提交SQL请求之前请求语句句柄。每个语句句柄与一个连接句柄有关。然而,每个连接句柄可以有多个与其相关的语句句柄。 下面以C语言为例说明传统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); //释放环境句柄 三. 利用VC++和ODBC技术获取异构型数据库结构信息 传统的ODBC编程过程比较复杂,各种参数不易理解,且直接获取返回的数据较困难。VC++ 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; } //异常信息的捕获 CATCH_ALL(e) { Close(); THROW_LAST(); } END_CATCH_ALL return TRUE; } //获取记录集信息 void CColumns::DoFieldExchange(CFieldExchange* pFX) { pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Text(pFX,_T("TABLE_QUALIFIER"),m_strTableQualifier); RFX_Text(pFX,_T("TABLE_OWNER"),m_strTableOwner); RFX_Text(pFX,_T("TABLE_NAME"),m_strTableName); RFX_Text(pFX,_T("COLUMN_NAME"),m_strColumnName); RFX_Int(pFX,_T("DATA_TYPE"),m_nDataType); RFX_Text(pFX,_T("TYPE_NAME"),m_strTypeName); RFX_Long(pFX,_T("PRECISION"),m_nPrecision); RFX_Long(pFX,_T("LENGTH"),m_nLength); RFX_Int(pFX,_T("SCALE"),m_nScale); RFX_Int(pFX,_T("RADIX"),m_nRadix); RFX_Int(pFX,_T("NULLABLE"),m_fNullable); RFX_Text(pFX,_T("REMARKS"),m_strRemarks); } CColumns::CColumns(CDatabase* pDatabase): CRecordset(pDatabase) { m_strTableQualifier = _T(""); m_strTableOwner = _T(""); m_strTableName = _T(""); m_strColumnName = _T(""); m_nDataType = 0; m_strTypeName = _T(""); m_nPrecision = 0; m_nLength = 0; m_nScale = 0; m_nRadix = 0; m_fNullable = 0; m_strRemarks = _T(""); m_nFields = 12; } CTable::CTable(CDatabase* pDatabase): CRecordset(pDatabase) { m_strTableQualifier = _T(""); m_strTableOwner = _T(""); m_strTableName = _T(""); m_strTableType = _T(""); m_strRemarks = _T(""); m_nFields = 5; } BOOL CTable::Open(LPCSTR pszTableQualifier, LPCSTR pszTableOwner,LPCSTR pszTableName,LPCSTR pszTableType, UINT nOpenType) { RETCODE nRetCode; UWORD bFunctionExists; //检验是否支持SQLTables 函数 AFX_SQL_SYNC(::SQLGetFunctions(m_pDatabase->m_hdbc, SQL_API_SQLTABLES,&bFunctionExists)); if (!Check(nRetCode) || !bFunctionExists) { if (!bFunctionExists) TRACE(_T("SQLTables 不支持\n")); return FALSE; } //设置缓冲区状态,分配语句句柄 SetState(nOpenType,NULL,readOnly); if (!AllocHstmt()) return FALSE; TRY { OnSetOptions(m_hstmt); AllocStatusArrays(); //调用 ODBC的SQLTables函数 AFX_ODBC_CALL(::SQLTables(m_hstmt, (UCHAR FAR*)pszTableQualifier,SQL_NTS, (UCHAR FAR*)pszTableOwner,SQL_NTS, (UCHAR FAR*)pszTableName,SQL_NTS, (UCHAR FAR*)pszTableType,SQL_NTS)); if (!Check(nRetCode)) ThrowDBException(nRetCode,m_hstmt); // 分配内存,填写信息 AllocAndCacheFieldInfo(); AllocRowset(); MoveNext(); m_bBOF = m_bEOF; } //异常信息的捕获 CATCH_ALL(e) { Close(); THROW_LAST(); } END_CATCH_ALL return TRUE; } void CTable::DoFieldExchange(CFieldExchange* pFX) { pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Text(pFX,_T("TABLE_QUALIFIER"),m_strTableQualifier); RFX_Text(pFX,_T("TABLE_OWNER"),m_strTableOwner); RFX_Text(pFX,_T("TABLE_NAME"),m_strTableName); RFX_Text(pFX,_T("TABLE_TYPE"),m_strTableType); RFX_Text(pFX,_T("REMARKS"),m_strRemarks); } 以上两个类对CRecordset的Open和DoFieldExchange函数进行了重载。应用程序可以在需要时创建CTable或Ccolumns类,并调用OPEN成员函数建立相应的表结构和字段结构记录集。接下来就可以通过下列函数来遍历异构型数据库的结构信息了。 Void CRecordset::MoveFirst(); //移到第一条记录 Void CRecordset::MoveLast(); //移到最后一条记录 Void CRecordset::MovePrev(); //移到前一条记录 Void CRecordset::MoveNext(); //移到后一条记录 BOOL CRecordset::IsBOF(); //判断是否到达第一条记录前 BOOL CRecordset::IsEOF(); //判断是否到达最后一条记录后 四、结束语 利用自定义的CTable和Ccolumns类,应用程序能获取任何异构型数据库库结构信息。根据获得的信息可以方便的对未知数据库进行相应的操作。若将CTable和Ccolumns类与文档类、视类结合起来,就可以在窗口里以一定的方式显示结构信息。作者利用以上技术在异构型数据库通信平台上成功实现了对各种异构型数据库库结构信息的获取。 参考文献: Mircosoft 《ODBC 2.0 Programmer´s Reference and SDK Guide》 利用VC++获取异构型数据库库结构信息展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




利用VC--获取异构型数据库库结构信息.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/11739858.html