科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC下异构数据源数据共享的实现

VC下异构数据源数据共享的实现

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍了数据库异构的主要特性以及在VC 环境下,基于ODBC技术的多源异构数据库的访问共享方法。

作者:陈殿波 隋树林 来源:论坛 2007年10月20日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
(2)动态连接数据库

  由于与数据库的连接是通过Cdatabase类对象来实现的,所以可以通过赋予CrecordSet类对象参数m_pDatabase以连接不同数据库的Cdatabase对象指针,就可以动态地连接数据库,示例代码如下:

void CDB::ChangeConnect()
{
Cdatabase*pdb=m_pSet->m_pDatabase;
Pdb->close();
Switch(m_id)
{
case 0:
if(pdb->Open(_T(“Super_ES”)))
{
AfxMessageBox(“数据源Super_ES打开失败”,”请检查相应的ODBC连接’,MB_OK|MB_ICONWARNING);
EXIT(0);
}
m_id=1;
break;
case 1:
if(!pdb->Open(_T(“Motor”)))
{
AfxMessageBox(“数据源Motor打开失败”,”请检查相应的ODBC连接”,MB_OK|MB_ICONWANING);
Exit(0);
}
m_id=0;
break;
}
}

  (3)动态连接表

  表的动态连接可以利用在调用CrecordSet::Open()函数时指定SQL语句来实现。同一个记录集对象只能访问具有相同结构的表,否则查询结果将无法与变量相对应。解决的办法是在不同的情况下使用不同的SQL语句,示例代码如下:

void CDB::ChangeTable()
{
if(m_pSet->IsOpen()) m_pSet->Close();
switch(m_id)
{
case 0:
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,”SELECT * FROM SLOT0”);//连接表SLOT0
m_id=1;
break;
case 1:
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,”SELECT * FROM SLOT1”);//连接表SLOT1
m_id=0;
break;
}
}

  (4)对数据库的其他操作

  添加记录可以使用AddNew()函数,要求数据库必须是以允许增加方式打开。

m_recordset1.addnew();
m_recordset1.Update();
m_recordset1.Requery(); /

  修改记录可以使用Edit()函数(m_pSet是指向结果集m_recordset2的指针)

m_pSet->Edit();
m_pSet->m_type=”完成”; ……
m_pSet->Update();
m_pSet->Requery();

  查询记录

  查询记录可以使用CRecordSet::Open()和CRecordSet::Requery()成员函数。在使用CrecordSet类对象之前,必须使用CRecordSet::Open()函数来获得有效的记录集。一旦已经使用过CRecordSet::Open()函数,则下一次查询时就可以用CRecordSet::Requery()函数了。

  在调用CRecordSet::Open()时,如果已经将一个已经打开的Cdatabase对象指针传给CrecordSet类对象的m_pDatabase成员变量,那么就可以使用该数据库对象建立ODBC连接;否则就需要新建一个CDatabase类对象并使其缺省的数据源相连,然后进行CrecordSet类对象的初始化。缺省数据源由GetDefaultConnect()函数获得。查询方法如下:

  1)通过SQL语句打开记录集

  SQL语句中包含查询条件

LPCTSTR strSQL; //strSQL是包含查询条件的SQL语句
m_recordset1.Open(strSQL)Requery();

  2)使用m_strFilter和m_strSort

  查询过程中也可以利用CrecordSet的成员变量m_strFilter和m_strSort来执行条件查询和结果排序:

  EMPLOYEE_AGE是参数值

_itoa(EMPLOYEE_AGE,ch,8); //EMPLOYEE
m_recordset1.m_strFilter=”EMP_AGE=”+Cstring(ch);
m_recordset1.m_strSort=”EMP_ID ASC”
m_recordset1.Requery();

  对应的SQL语句为

SELECT * FROM PERSONNEL
WHERE EMP_AGE= EMPLOYEE_AGE
ORDER BU EMP_ID ASC;

  3)参数查询

  利用参数查询可以更直观、更方便地完成条件查询任务。

  声明参变量

int EMPLOYEE_AGE;
Cstring strDept;

  在构造函数中初始化参变量

EMPLOYEE_AGE=24;
StrDept=_T(“Manufacture”); //Manufacture为员工所在的部门。
m_nParams=2;

  将列与参数进行绑定

pFX->SetFeildType(CfieldExchange::param)
RFX->Int(pFX,_T(“EMP_AGE”),EMPLOYEE_AGE);
RFX_Text(pFX,_T(“DEPT_NAME”),strDept);

  完成以上步骤后就可以利用参变量进行条件查询了:

m_recordset1->m_strFilter=”EMP_AGE=?AND DEPT_NAME=?”;
m_recordset1->EMP_AGE=24;
m_recordset1->DEPT_NAME=”Manufacture”;
m_recordset1->Requery();

  参变量的值按绑定的顺序替换查询字串中的“?”适配符

  如果查询结果是多条记录,可以用CrecordSet类的函数MoveFirst()和MoveNext()等函数来取得结果集中相对应的记录。

  删除记录

  应用Delete()函数,且在调用Delete() 函数后不需要再调用Update() 函数。

M_pSet->Delete();

  撤销操作

  如果用户选择了增加或修改记录后希望放弃当前操作。可以在调用Update()函数之前调用CrecordSet::Move(AFX_MOVE_REFRESH)来撤销增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中参数AFX_MOVE_REFRESH的值为0。

  (5)SQL语句的直接执行

  通过CrecordSet类可以完成大多数的查询操作,但有时需要对数据库建立新表、删除表和建立新的字段等,这就需要用到Cdatabase类直接执行SQL语句的机制。这可以通过Cdatabase::ExecuteSQL()函数来完成。

//下面是为自己创建的类Ctry编写执行SQL的函数MyExcuteSQL
BOOL Ctry::MyExecuteSQL(const Cstring&strSQL)
{
TRY
{
m_database->ExecuteSQL(strSQL);//直接执行SQL语句
}
CATCH(CDBException *e)
{
Cstring strMsg;
StrMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
StrMsg+=strSQL;
return FALSE;
}
END_CATCH
return TRUE
}

  Visual C++中的ODBC类库可以帮助程序员完成绝大多数的数据库操作。利用ODBC技术可以使程序员从具体的DBMS中解脱出来,从而极大地减少了软件开发的工作量,提高了效率并增强了软件的可靠性

  4 .结束语

  随着信息技术的高速发展,实现异构数据库的数据共享,可以最大限度的减少不必要的开支,用VC++的ODBC技术,可以很好的解决DBMS本身异构的多源异构数据库的共享问题。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章