(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() 函数。
撤销操作
如果用户选择了增加或修改记录后希望放弃当前操作。可以在调用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++(www.cppentry.com)中的ODBC类库可以帮助程序员完成绝大多数的数据库操作。利用ODBC技术可以使程序员从具体的DBMS中解脱出来,从而极大地减少了软件开发的工作量,提高了效率并增强了软件的可靠性
4 .结束语
随着信息技术的高速发展,实现异构数据库的数据共享,可以最大限度的减少不必要的开支,用VC++(www.cppentry.com)的ODBC技术,可以很好的解决DBMS本身异构的多源异构数据库的共享问题。
|