65.9K
CodeProject 正在变化。 阅读更多。
Home

将 MS DataGrid 控件与 OLE DB 消费者一起使用

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (8投票s)

2001年9月23日

3分钟阅读

viewsIcon

191810

downloadIcon

2153

在您的 C++ 应用程序中使用 MS DataGrid 控件以及 OLE DB 消费者模板

Sample Image - msdatagridoledb.gif

引言

这是之前一篇文章的后续文章,该文章向您展示了如何将 MS DataGrid 与 ADO 一起使用。 请参阅文章

本文将向您展示如何将 MS DataGrid 与 OLE DB 使用者模板一起使用。

这是一个简单的实现,向您展示了如何将 MS DataGrid 控件与 OLE DB 使用者一起使用。 该示例已经过 MS Access 和 SQL Server 的测试,理论上您应该能够将其用于所有支持 OLE DB 的数据源。

您可以在 MSDN 上找到有关 DataGrid 控件及其属性的信息。

要求

MDAC v2.1 或更高版本(可以从 Microsoft 获取)。 这包含连接到数据库或数据源所需的 OLE DB 驱动程序。

要了解与 DataGrid 的绑定过程,还需要具备良好的 OLE DB 使用者知识。

使用 OLE DB 使用者

为了使用 OLE DB 使用者模板,您需要包含以下头文件,这应该在您的 *stdafx.h* 文件中完成。

#include "atldbcli.h"

将 DataGrid 控件添加到项目

您需要将 DataGrid 控件添加到您的项目,这通常通过

项目->添加到项目->组件和控件

从对话框中选择注册的 ActiveX 控件文件夹,然后找到 Microsoft DataGrid 控件,版本 6 (OLE DB)

Registered Controls - msdatagridoledb2.gif

然后按插入按钮,将出现以下对话框

Insert Classes - msdatagridoledb3.gif

对于此示例,您只需要 CDataGrid 类,因此只选中此类。

转到资源编辑器,您应该看到 MS DataGrid 控件已添加到您可以使用的控件集合中。 CDataGrid 类将在 *DataGrid.h* 和 *DataGrid.CPP* 中为您生成,这些文件也将添加到您的项目中。

将 DataGrid 绑定到对话框或 Formview

以通常的方式使用类向导将控件绑定到对话框或 Formview。 类向导会将 CDataGrid 类与控件绑定。

CDataGrid m_ctlDataGrid;
void CDataGridView::DoDataExchange(CDataExchange* pDX)
{
    CFormView::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CDataGridView)
    DDX_Control(pDX, IDC_DATAGRID1, m_ctlDataGrid);
    //}}AFX_DATA_MAP
}

将 DataGrid 绑定到 OLE DB 模板命令

在将 Recordset 绑定到 MS DataGrid 时,实际上需要一点 ADO。 OLE DB Command 需要在绑定到 MS DataGrid 之前转换为 ADO Recordset

从 OLE DB Command 到 ADO Recordset 的转换可以通过 ADO RecordsetConstruction 完成(有关示例,请参见下面的代码)。

您必须在运行时使用 ADO Recordset 绑定 DataGrid。 以下代码给出了使用的示例。

void CDataGridView::UpdateGridDetails(const CString& sTableName)
{
    CMainFrame* pMainFrame = reinterpret_cast<CMAINFRAME*>(AfxGetMainWnd());
    if (pMainFrame)
    {        
        CCommand<CDYNAMICACCESSOR, CRowset> dbCommand;

        try 
        {    
            Recordset20Ptr spRs;
            ADORecordsetConstructionPtr spADOsCt;

            CDBPropSet propset(DBPROPSET_ROWSET);            
            propset.AddProperty(DBPROP_CLIENTCURSOR, true);
            propset.AddProperty(DBPROP_IRowsetChange, true);
            propset.AddProperty(DBPROP_UPDATABILITY, 
               DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | 
               DBPROPVAL_UP_DELETE);

            CString sCommand;
            sCommand.Format("SELECT * FROM [%s]", sTableName);
            
            HRESULT hr = dbCommand.Create(pMainFrame->m_session, 
                                (LPCTSTR)sCommand);
            if(FAILED(hr))
                _com_issue_error(hr);
            
            hr = dbCommand.Open(&propset, NULL, true); 
            if(FAILED(hr)) 
               _com_issue_error(hr);
            
            hr = spRs.CreateInstance(__uuidof(Recordset));
            if(FAILED(hr))
               _com_issue_error(hr);
            
            hr = spRs->QueryInterface(__uuidof(ADORecordsetConstruction),
                (void**)&spADOsCt);

            if(FAILED(hr))
               _com_issue_error(hr);

            hr= spADOsCt->put_Rowset(dbCommand.m_spRowset); 
            if(FAILED(hr))
               _com_issue_error(hr);

            //Demonstrates,  how to populate DataGrid 
            //by assigning it a Recordset object. 
            m_ctlDataGrid.SetCaption(sTableName); 
            m_ctlDataGrid.SetRefDataSource(NULL); 
            m_ctlDataGrid.SetRefDataSource( (LPUNKNOWN) spRs);
            m_ctlDataGrid.Refresh();
        } 
        catch (_com_error&e)
        { 
           AfxMessageBox(GetErrorDescription(e));
        }
        
        UpdateData(FALSE);
    }
}

SetRefDataSource 属性用于将生成的 ADO Recordset 绑定到控件。 请注意,生成的 Recordset 光标的类型决定了可以在网格中执行的操作。 例如,如果使用仅向前光标,则网格将不允许您通过网格添加、编辑或删除记录。

注意 - 需要设置客户端光标位置才能使其与 MS Access 一起使用(SQL Server 中不需要此操作)。

© . All rights reserved.