MFC为连接数据源提供了一个数据库类CDatabase,通过它我们可以非常方便地与数据源建立连结:
//m_db是CDatabase的对象
//m_szUserId,m_szPassword是CString对象,为访问数据源的用户名和密码
CString str;
str = _T("DSN=xhmtest;UID=")+m_szUserId+_T(";PWD=")+m_szPassword;
if (! m_db.OpenEx(str, CDatabase::noOdbcDialog ) ){
AfxMessageBox("打开数据源失败");
}
另外,如果我们想对数据源进行操作,就可以利用打开的CDatabase对象执行SQL语句实现。如新建一张表:
str = "CREATE TABLE TableDemo (Column1TEXT, Column2 NUMBER)";
m_db.ExecuteSQL(sSql);
3.得到数据库的结构信息
在VC++中可以单独利用ODBC API获取数据库的结构信息,但方法非常复杂,各种参数也不易理解,且返回的结果不易获取。MFC中也没有为应用程序开发者得到数据库结构信息而提供单独的类。但是我们还是可以通过一些已有的方法方便地获得数据库的结构信息。
3.1 得到数据库中的表
利用ODBC API函数SQLTables可以得到数据库中的表信息,但使用不易。
在MSDN的sample中有一个catalog例程,它示范了如果得到一个数据库的表信息和表中的字段信息,该程序中有两个非常实用的类:Ctables和Ccolumns。其中CTables继承CRecordset类,通过非常巧妙的方法封装了SQLTables函数,并将结果集存于CRecordset类,方便获取。
在程序中我们可以这样应用:
//m_db是已经打开的CDatabse对象,
//m_strTableOwner是CComboBox对象
CTables rs(&m_db);
rs.Open(NULL, NULL, NULL, "TABLE");
CString strTableRef;
m_combTable.ResetContent();
while (!rs.IsEOF())
{
strTableRef = _T("[");
if (!rs.m_strTableOwner.IsEmpty())
strTableRef += rs.m_strTableOwner + _T("].[");
strTableRef += rs.m_strTableName + _T("]");
m_combTable.AddString(strTableRef);
rs.MoveNext();
}
rs.Close();
在CTables对象Open方法第四个能数指定“TABLE”是指返回库中的表,当该参数为“SYSTEM TABLE”时返回系统表,当为NULL时,返回所有表。
3.2 得到表中字段结构
得到表中字段结构有三种具体实现方式:
①直接利用ODBC API 函数SQLColumn;其实现也同样复杂。