MFC ODBC数据库访问技术

6.2 MFC ODBC数据库访问技术
6.2.1 记录查询
使用CRecordSet的Open()和Requery()成员函数可以实现记录查询。需要注意的是,在使用CRecordSet的类对象之前,必须使用CRecordSet的成员函数Open()来获得有效的记录集。一旦使用过Open()函数,再次查询时使用Requery()函数就可以了。在调用Open()函数时,如果已经将一个打开的CDatabase对象指针传递给CRecordSet类对象的m_pDatabase成员变量,那么,CRecordSet类对象将使用该数据库对象建立ODBC连接;否则,如果m_pDatabase为空指针,对象就需要就新建一个CDatabase类对象并使其与缺省的数据源相连,然后进行CRecordSet类对象的初始化。缺省数据源由GetDefaultConnect()函数获得。也可以通过特定的SQL语句为CRecordSet类对象指定数据源,并以它来调用CRecordSet类的Open()函数,例如:
myRS.Open(AFX_DATABASE_USE_DEFAULT,strSQL);

如果没有指定参数,程序则使用缺省的SQL语句,即对在GetDefaultSQL()函数中指定的SQL语句进行操作,代码如下:

CString CMyRS::GetDefaultSQL()
{return _T("[Name],[Age]");}
对于GetDefaultSQL()函数返回的表名,对应的缺省操作是SELECT语句,例如:
SELECT * FROM BasicData,MainSize
在查询过程中,也可以利用CRecordSet类的成员变量m_strFilter和m_strSort来执行条件查询和结果排序。m_strFilter用于指定过滤字符串,存放着SQL语句中关键字WHERE后的条件语句;m_strSort用于指定用于排序的字符串,存放着SQL语句中关键字ORDER BY后的字符串。例如:
myRS.m_strFilter="Name='刘鹏'";
myRS.m_strSort="Age";
myRS.Requery();
数据库查询中对应的SQL语句为:
SELECT * FROM BasicData,MainSize WHERE Name='刘鹏' ORDER BY Age
除了直接赋值给成员变量m_strFilter以外,还可以通过参数化实现条件查询。利用参化可以更直观、更方便地完成条件查询任务。参数化方法的步骤如下:
(1) 声明参变量,代码如下:
CString strName;
int nAge;
(2) 在构造函数中初始化参变量如下:
strName =_T("");
nAge =0;
m_nParams=2;
(3) 将参变量与对应列绑定,代码如下:
pFX->SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T("Name"), strName);
RFX_Single(pFX,_T("Age"), nAge);
完成以上步骤之后就可以利用参变量进行条件查询了,代码如下:
m_pmyRS->m_strFilter="Name=? AND age=?";
m_ pmyRS -> strName ="刘鹏";
m_ pmyRS ->nAge=26;
m_ pmyRS ->Requery();
参变量的值按绑定的顺序替换查询字串中的“?”通配符。
如果查询的结果是多条记录,可以利用CRecordSet类的成员函数Move(),MoveNext(),MovePrev(),MoveFirst()和MoveLast()来移动记录光标。
6.2.2 记录添加
使用AddNew()成员函数能够实现记录添加,需要注意的是,在记录添加之前必须保证数据库是以允许添加的方式打开的,代码如下:
m_ pmyRS ->AddNew(); // 在表的末尾添加新记录
m_ pmyRS ->SetFieldNull(&(m_pSet->m_type), FALSE);

m_ pmyRS ->m_strName="刘鹏"; // 输入新的字段值
m_ pmyRS ->m_nAge=26; // 输入新的字段值
m_ pmyRS -> Update(); // 将新记录存入数据库
m_ pmyRS ->Requery(); // 重新建立记录集
6.2.3 记录删除
调用Delete()成员函数能够实现记录删除,在调用Delete()函数后不需调用Update()函数,代码如下:
m_ pmyRS ->Delete();
if (!m_ pmyRS ->IsEOF())
m_ pmyRS ->MoveNext();
else
m_ pmyRS ->MoveLast();
6.2.4 记录修改
调用Edit()成员函数可以实现记录修改,在修改完成后需要调用Update()将修改结果存入数据库,代码如下:
m_ pmyRS ->Edit(); // 修改当前记录
m_ pmyRS ->m_strName="刘波"; // 修改当前记录字段值
...
m_ pmyRS ->Update(); // 将修改结果存入数据库
m_ pmyRS ->Requery();

6.2.5 撤销数据库更新操作
如果用户增加或者修改记录后希望放弃当前操作,可以在调用Update()函数之前调用Move()函数,就可以使数据库更新撤销了,代码如下:
CRecordSet::Move(AFX_MOVE_REFRESH);
该函数用于撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中参数AFX_MOVE_REFRESH的值为零。
6.2.6 直接执行SQL语句
虽然通过CRecordSet类我们可以完成大多数的数据库查询操作,而且在CRecordSet类的Open()成员函数中也可以提供SQL语句,但有的时候我们还想进行一些其他操作,例如建立新表、删除表、建立新的字段等等,这时就需要用到CDatabase 类的直接执行SQL语句的机制。通过调用CDatabase类的ExecuteSQL()成员函数就能够完成QL语句的直接执行,代码如下:
BOOL CMyDB::ExecuteSQLWithReport (const CString& strSQL)
{
TRY
{

m_pMyDB->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无关性,因此在应用中应当慎用此类操作。
6.2.7 MFC ODBC的数据库操作过程
同ODBC API编程类似,MFC的ODBC编程也要先建立同ODBC数据源的连接,这个过程由一个CDatabase对象的Open函数实现。然后CDatabase对象的指针将被传递到CRecordSet对象的构造函数里,使CRecordSet对象与当前建立起来的数据源连接结合起来。
完成数据源连接之后,大量的数据库编程操作将集中在记录集的操作上。CRecordSet类的丰富的成员函数可以让开发人员轻松地完成基本的数据库应用程序开发任务。
当然,完成了所有的操作之后,在应用程序退出运行状态的时候,需要将所有的记录集关闭,并关闭所有同数据源的连接。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值