3.2 应用ODBC编程(www.cppentry.com)
可以应用AppWizard来建立一个ODBC的应用程序框架,也可以直接使用ODBC来进行数据库编程(www.cppentry.com),这时,应包括头文件afxdb.h。
应用ODBC编程(www.cppentry.com)两个最重要的类是CDatabase和CRecordSet,但在应用程序中,不应直接使用CRecordSet类,而必须从CRecordSet类产生一个导出类,并添加相应于数据库表中字段的成员变量。随后,重载CRecordset类的成员函数DoFieldExchange,该函数通过使用RFX函数完成数据库字段与记录集域数据成员变量的数据交换,RFX函数同对话框数据交换(DDX)机制相类似,负责完成数据库与成员变量间的数据交换。 下面举例说明在Visual C++(www.cppentry.com)环境中ODBC 的编程(www.cppentry.com)技巧:
3.21 数据库连接
在CRecordSet类中定义了一个成员变 量m_pDatabase:
CDatabase *m_pDatabase;
它是指向对象数据库类的指针。如果在CRecordSet类对象调用Open()函数之前,将一个已经打开的CDatabase类对象指针传给m_pDatabase,就能共享相同 的CDatabase类对象。如:
CDatabase m_db; CRecordSet m_set1,m_set2; m_db.Open(_T("Super_ES")); // 建 立ODBC 连 接 m_set1.m_pDatabase=&m_db; //m_set1 复 用m_db 对 象 m_set2.m_pDatabse=&m_db; // m_set2 复 用m_db 对 象
或如下:
Cdatabase db; db.Open(“Database”); //建立ODBC连接 CrecordSet m_set(&db); //构造记录集对象,使数据库指向db |
3.22 查询记录
查询记录使用CRecordSet::Open()和 CRecordSet::Requery()成员函数。在使用CRecordSet类对象之前,必须使用 CRecordSet::Open()函数来获得有效的记录集。一旦已经使用过CRecordSet::Open() 函数,再次查询时就可以应用CRecordSet::Requery()函数。在调 用CRecordSet::Open()函数时,如果已经将一个已经打开的CDatabase 对象指针传给CRecordSet类对象的m_pDatabase成员变量,则使 用该数据库对象建立ODBC连接;否则如果m_pDatabase为空指 针,就新建一个CDatabase类对象并使其与缺省的数据源 相连,然后进行CRecordSet类对象的初始化。缺省数据源 由GetDefaultConnect()函数获得。你也可以提供你所需要的SQL 语句,并以它来调用CRecordSet::Open()函数,例如:
| m_Set.Open(AFX_DATABASE_USE_DEFAULT,strSQL); |
如果没有指定参数,程序则使 用缺省的SQL语句,即对在GetDefaultSQL()函数中指定的SQL语 句进行操作:
CString CTestRecordSet::GetDefaultSQL()
{return _T("[BasicData],[MainSize]");}
|
对于GetDefaultSQL()函数返回的表名, 对应的缺省操作是SELECT语句,即:
| SELECT * FROM BasicData,MainSize |
查询过程中也可以利用CRecordSet的 成员变量m_strFilter和m_strSort来执行条件查询和结果排序。m_strFilter 为过滤字符串,存放着SQL语句中WHERE后的条件串;m_strSort 为排序字符串,存放着SQL语句中ORDERBY后的字符串。 如:
m_Set.m_strFilter="TYPE='电动机'"; m_Set.m_strSort="VOLTAGE"; m_Set.Requery(); |
对应的SQL语句为:
SELECT * FROM BasicData,MainSize WHERE TYPE='电动机' ORDER BY VOLTAGE |
除了直接赋值给m_strFilter以外,还 可以使用参数化。利用参数化可以更直观,更方便地 完成条件查询任务。使用参数化的步骤如下:
(1).声明参变量:
(2).在构造函数中初始化参变量
p1=_T(""); p2=0.0f; m_nParams=2; |
(3).将参变量与对应列绑定
pFX->SetFieldType(CFieldExchange::param) RFX_Text(pFX,_T("P1"),p1); RFX_Single(pFX,_T("P2"),p2); |
完成以上步骤之后就可以利用参变量进行条件查询了:
m_pSet->m_strFilter="TYPE= ANDVOLTAGE= "; m_pSet->p1="电动机"; m_pSet->p2=60.0; m_pSet->Requery(); |
参变量的值按绑定的顺序替换 查询字串中的“ ”适配符。
如果查询的结果是多条记录的 话,可以用CRecordSet类的函数Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()来移动光标。
|