|
使用OLEDB编写数据库应用程序(2) CTable类 CTable类用于对数据库的简单访问,用数据源的名称得到行集,从而得到数据。 CCommand类 CCommand类用于支持命令的数据源。可以用Open()函数来执行SQL命令,也可以Prepare()函数先对命令进行准备,对于支持命令的数据源,可以提高程序的灵活性和健壮性。 在stdafx.h头文件里,加入如下代码。 #include <atlbase.h> extern CComModule _Module; #include <atlcom.h> #include <atldbcli.h> #include <atldbsch.h> // if you are using schema templates 在stdafx.cpp文件里,加入如下代码。 #include <atlimpl.cpp> CComModule _Module; 决定使用何种类型的存取程序和行集。 获取数据 在打开数据源,会话,行集对象后就可以获取数据了。所获取的数据类型取决于所用的存取程序,可能需要绑定列。按以下步骤。 1、 用正确的命令打开行集对象。 2、 如果使用CManualAccessor,在使用之前与相应列进行绑定。要绑定列,可以用函数GetColumnInfo,如下所示: // Get the column information ULONG ulColumns = 0; DBCOLUMNINFO* pColumnInfo = NULL; LPOLESTR pStrings = NULL; if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK) AfxThrowOLEDBException(rs.m_pRowset, IID_IColumnsInfo); strUCt MYBIND* pBind = new MYBIND[ulColumns]; rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns); for (ULONG l=0; l<ulColumns; l++) rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, &pBind[l].szValue, NULL, &pBind[l].dwStatus); rs.Bind(); 3、 用while循环来取数据。在循环中,调用MoveNext来测试光标的返回值是否为S_OK,如下所示: while (rs.MoveNext() == S_OK) { // Add code to fetch data here // If you are not using an auto accessor, call rs.GetData() } 4、 在while循环内,可以通过不同的存取程序获取数据。 1) 如果使用的是CAccessor类,可以通过使用它们的数据成员进行直接访问。如下所示: 2) 如果使用的是CDynamicAccessor 或CDynamicParameterAccessor 类,可以通过GetValue或GetColumn函数来获取数据。可以用GetType来获取所用数据类型。如下所示: while (rs.MoveNext() == S_OK) { // Use the dynamic accessor functions to retrieve your // data ULONG ulColumns = rs.GetColumnCount(); for (ULONG i=0; i<ulColumns; i++) { rs.GetValue(i); } } 3) 如果使用的是CManualAccessor,可以指定自己的数据成员,绑定它们。就可以直接存取。如下所示:
|