VC常用数据库操作方法 联系客服

发布时间 : 星期六 文章VC常用数据库操作方法更新完毕开始阅读cb09d9010740be1e650e9a09

----4.删除记录

----直接使用Delete()函数,并且在调用Delete() 函数之后不需调用Update()函数:

m_pSet->Delete(); if(!m_pSet->IsEOF()) m_pSet->MoveNext(); else

m_pSet->MoveLast(); ----5.修改记录

----修改记录使用Edit()函数:

m_pSet->Edit(); //修改当前记录 m_pSet->m_type=\发电机\//修改当前记录字段值 ...

m_pSet->Update(); //将修改结果存入数据库 m_pSet->Requery(); ----6.撤消操作

----如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用Update()函数之前调用:

----CRecordSet::Move(AFX_MOVE_REFRESH); ----来撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中的参数AFX_MOVE_REFRESH 的值为零。 ----7.数据库连接的复用

----在CRecordSet类中定义了一个成员变 量m_pDatabase: ----CDatabase *m_pDatabase;

----它是指向对象数据库类的指针。如果在CRecordSet类对象调用Open()函数之前,将一个已经打开的CDatabase类对象指针传给m_pDatabase,就能共享相同 的CDatabase类对象。如: CDatabase m_db;

CRecordSet m_set1,m_set2;

m_db.Open(_T(\// 建 立ODBC 连 接

m_set1.m_pDatabase=&m_db; //m_set1 复 用m_db 对 象 m_set2.m_pDatabse=&m_db; // m_set2 复 用m_db 对 象 ----8.SQL语句的直接执行

----虽然通过CRecordSet类,我们可以完成 大多数的查询操作,而且在CRecordSet::Open()函数中也可以 提供SQL语句,但是有的时候我们还想进行一些其他操 作,例如建立新表,删除表,建立新的字段等等,这 时就需要使用到CDatabase类的直接执行SQL语句的机制。通 过调用CDatabase::ExecuteSQL()函数来完成SQL语句的直接执行:

BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL) {

TRY {

m_pdb->ExecuteSQL(strSQL); //直接执行SQL语句 }

CATCH (CDBException,e) {

CString strMsg;

strMsg.LoadString(IDS_EXECUTE_SQL_FAILED); strMsg+=strSQL; return FALSE; }

END_CATCH return TRUE; }

----应当指出的是,由于不同DBMS提 供的数据操作语句不尽相同,直接执行SQL语句可能会 破坏软件的DBMS无关性,因此在应用中应当慎用此类操 作。 ----9.动态连接表

----表的动态连接可以利用在调用CRecordSet::Open() 函数时指定SQL语句来实现。同一个记录集对象只能访 问具有相同结构的表,否则查询结果将无法与变量相 对应。

void CDB::ChangeTable() {

if (m_pSet->IsOpen()) m_pSet->Close(); switch (m_id) {

case 0:

m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE, \// 连 接 表SLOT0 m_id=1; break; case 1:

m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE, \// 连 接 表SLOT1 m_id=0; break; } }

----10.动态连接数据库

----由于与数据库的连接是通过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连接\ exit(0); }

m_id=1; break; case 1:

if (!pdb->Open(_T(\//连接数据源Motor {

AfxMessageBox(\数据源Motor打开失败,\

---- \请检查相应的ODBC连接\ exit(0); }

m_id=0; break; }

4. ADO的数据库实现

1、引入ADO库文件

使用ADO前必须在工程的stdafx.h文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下所示: 代码1:用#import引入ADO库文件

#import \no_namespaces rename(\

这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。

2、初始化OLE/COM库环境

必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。

代码2:初始化OLE/COM库环境 BOOL CADOApp::InitInstance() {

if(!AfxOleInit()) {

AfxMessageBox(“OLE初始化出错!”); return FALSE;

} ?? }

函数AfxOleInit在每次应用程序启动时初始化OLE/COM库环境。 同DAO和CDatabase一样,ADO由几个接口组成: _ConnectionPtr,_CommandPtr和_RecordsetPtr.

不同于DAO和Cdatabase的是,ADO基于COM的接口,因此,假如你没有接触过COM,你应该在使用ADO前先找有关书籍了解一下COM。

3、ADO接口

ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。

_ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。通常同CDatabase一样,使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。

_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。

_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。

4、使用_ConnectionPtr接口

_ConnectionPtr是一个连接接口,它类似于CDatabase和CDaoDatabase。它们的工作原理相似。首先创建一个_ConnectionPtr接口实例,接着指向并打开一个ODBC数据源或OLE DB数据提供者(Provider)。以下代码和CDaoDatabase分别创建一个基于DSN和非DSN的数据连接。

代码3:使用CDaoDatabase(基于DSN)

CDaoDatabase MyDb = new CDaoDatabase();

MyDb.Open(NULL,FALSE,FALSE,\

代码4:使用CDaoDatabase(基于非DSN) CDaoDatabase MyDb = new CDaoDatabase();

MyDb.Open(NULL,FALSE,FALSE,\DATABASE=samp;UID=admin;PWD=admin\