`
dowhathowtodo
  • 浏览: 806907 次
文章分类
社区版块
存档分类
最新评论

visual c++ 2008进行MySQL编程(ODBC) --三 查询数据库

 
阅读更多

前面两讲说到了,安装MySql数据库,安装ODBC驱动以及使用CDatabase操作数据库的基本操作比如Add del edit,链接如下:

visual c++ 2008进行MySQL编程(ODBC) -- (一) 套装安装

visual c++ 2008进行MySQL编程(ODBC) --二 操作数据库

visual c++ 2008进行MySQL编程(ODBC) --三 查询数据库

visual c++ 2008进行MySQL编程(ODBC)-- (四) 终极实现 之 派生CRecordset 上

visual c++ 2008进行MySQL编程(ODBC)-- (四) 终极实现 之 派生CRecordset 中

今天引入一个新的类,CRecordset,其实前面的编程操作对于CRecordset类而言,相对而言就非常的弱小了呵呵,后续一一说到吧。今天的工作就是使用这个类遍历一下我们数据库里面的条目。

继续在上一个文章的工程上做这一切。

一、在对话框里面托一个listtree控件,修改属性为报表模式:

上图的黄色的框框的属性要修改report,报表格式。

二、给这个新加的list control添加成员变量,m_list_ctrl:

三、在Cmy_dbDlg类的初始化函数OnInitDialog()里面添加添加的list control的初始化代码:

    m_list_ctrl.InsertColumn( 0, _T("Cust Id"), LVCFMT_CENTER, 70 );//插入列 
    m_list_ctrl.InsertColumn( 1, _T("Cust Name"), LVCFMT_CENTER, 85 ); 

四、添加一个按钮,用作查询,同时给这个按钮添加Cmy_dbDlg的单击响应函数:

查询的按钮就是上图的GetRecord。

消息响应函数为:

void Cmy_dbDlg::OnBnClickedGetAllItem()
{
    // TODO: Add your control notification handler code here
}


四、现在来实现这个消息函数,我们使用类CRecordset,具体的要使用的函数,我们看看MSDN的文档:

Opens the recordset by retrieving the table or performing the query that the recordset represents.
virtual BOOL Open( 
   UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, 
   LPCTSTR lpszSQL = NULL, 
   DWORD dwOptions = none  
);
 
Returns nonzero if the recordset has been positioned before the first record. There is no current record.
BOOL IsBOF( ) const;
 
Returns nonzero if the recordset has been positioned after the last record. There is no current record.
BOOL IsEOF( ) const;

Makes the first record in the next rowset the current record.
void MoveNext( );
 


Open函数打开指定的数据库,之后才可以遍历,如果数据库为空,则IsBOF返回true,如果需要遍历每一条,则使用MoveNext( )。

使用起来就是这么简单。

五、OnBnClickedGetAllItem()的实现修改如下:

void Cmy_dbDlg::OnBnClickedGetAllItem()
{
    // TODO: Add your control notification handler code here
    CRecordset my_record(&m_db_opr);
    
    try
    {
        int count = 0;
        CString str;

        my_record.Open(CRecordset::snapshot, _T("select * from customer"));

        if(my_record.IsBOF())
        {
            return;
        }

        while(!my_record.IsEOF())
        {
            my_record.GetFieldValue((short)0, str);
            m_list_ctrl.InsertItem(count, str);

            my_record.GetFieldValue(1, str);
            m_list_ctrl.SetItemText(count, 1, str);
            
            my_record.MoveNext();
            count++;
        }
    }
    catch(CDBException* pe)
    {
        // The error code is in pe->m_nRetCode
        pe->ReportError();
        pe->Delete();
    }
}


现在解释一下上面的代码吧,Open函数还是请大家参考一下MSDN呵呵,第一个参数可以为:

  • CRecordset::dynaset A recordset with bi-directional scrolling. The membership and ordering of the records are determined when the recordset is opened, but changes made by other users to the data values are visible following a fetch operation. Dynasets are also known as keyset-driven recordsets.

  • CRecordset::snapshot A static recordset with bi-directional scrolling. The membership and ordering of the records are determined when the recordset is opened; the data values are determined when the records are fetched. Changes made by other users are not visible until the recordset is closed and then reopened.

  • CRecordset::dynamic A recordset with bi-directional scrolling. Changes made by other users to the membership, ordering, and data values are visible following a fetch operation. Note that many ODBC drivers do not support this type of recordset.

    CRecordset::forwardOnly A read-only recordset with only forward scrolling.

    For CRecordset, the default value is CRecordset::snapshot. The default-value mechanism allows the Visual C++ wizards to interact with both ODBCCRecordset and DAOCDaoRecordset, which have different defaults.

    具体我就不翻译了,mysql的ODBC貌似只支持snapshot,就是快照,静态的获取当前的数据库里面的条目数。

    Open的第二个参数,是一个字符串,就是用于查询数据库的的sql语句。

    编译代码,运行,我们执行一下,单击GetRecord按钮就能查询到当前的所有条目,如图:

    挺完美对吧。

    还没有结束,还要继续说说如何设定查询范围,设定排序方式等等。


    六、我们设定过滤规则,比如我想要查询100<= x <= 200范围内的cust id的条目,如何进行?

    解决这个问题需要求助于

    m_strFilter

    这个成员变量了,所以我们在Open函数调用之前,设定查询范围,如下:

            my_record.m_strFilter = _T("cust_id <= 200 and cust_id >= 100");
    
            my_record.Open(CRecordset::snapshot, _T("select * from customer"));


    那么修改后面的OnBnClickedGetAllItem函数如下:

    void Cmy_dbDlg::OnBnClickedGetAllItem()
    {
        // TODO: Add your control notification handler code here
        CRecordset my_record(&m_db_opr);
        
        try
        {
            int count = 0;
            CString str;
    
            my_record.m_strFilter = _T("cust_id <= 200 and cust_id >= 100");
    
            my_record.Open(CRecordset::snapshot, _T("select * from customer"));
    
            if(my_record.IsBOF())
            {
                return;
            }
    
            while(!my_record.IsEOF())
            {
                my_record.GetFieldValue((short)0, str);
                m_list_ctrl.InsertItem(count, str);
    
                my_record.GetFieldValue(1, str);
                m_list_ctrl.SetItemText(count, 1, str);
                
                my_record.MoveNext();
                count++;
            }
        }
        catch(CDBException* pe)
        {
            // The error code is in pe->m_nRetCode
            pe->ReportError();
            pe->Delete();
        }
    }
    
    
    


    我们可以看到,查询结果如下图:

    但是我们知道,设定查询范围怎么弄?需要where 子句,比如 :

    select * from customer where cust_id <= 200 and cust_id >= 100;

    但是使用了m_strFilter这个作为过滤规则的设定,就不能使用带上where了。


    七、我们可以设定排序规则,比如按照cust id排序,而且是逆序,这个操作就要借助于

    m_strSort

    了,也只要设定排序对象就是了:

    my_record.m_strFilter = _T("cust_id <= 200 and cust_id >= 100");
            
    my_record.m_strSort = _T("cust_id desc");
    my_record.Open(CRecordset::snapshot, _T("select * from customer"));

  • 和上面过滤的规则一样,sql语句是需要Order by子句的,如果使用了m_strSort之后,那么就不能有“order by”了,而这个语句:
  • my_record.m_strSort = _T("cust_id desc");

  • 就相当于, “order by cust_id desc” 子句了。
  • 修改后的消息响应函数就是这个样子的了:


  • void Cmy_dbDlg::OnBnClickedGetAllItem()
    {
        // TODO: Add your control notification handler code here
        CRecordset my_record(&m_db_opr);
        
        try
        {
            int count = 0;
            CString str;
    
            my_record.m_strFilter = _T("cust_id <= 200 and cust_id >= 100");
            my_record.m_strSort = _T("cust_id desc");
    
            my_record.Open(CRecordset::snapshot, _T("select * from customer"));
    
            if(my_record.IsBOF())
            {
                return;
            }
    
            while(!my_record.IsEOF())
            {
                my_record.GetFieldValue((short)0, str);
                m_list_ctrl.InsertItem(count, str);
    
                my_record.GetFieldValue(1, str);
                m_list_ctrl.SetItemText(count, 1, str);
                
                my_record.MoveNext();
                count++;
            }
        }
        catch(CDBException* pe)
        {
            // The error code is in pe->m_nRetCode
            pe->ReportError();
            pe->Delete();
        }
    }
    


    执行一下程序,自然就逆序打印了:



    是不是很不错啊?
    还是那句话,如果有下一个博文,我会继续说更好的使用visual c++ 2008对mysql数据库编程的实现。


  • 分享到:
    评论

    相关推荐

      mysql-connector-odbc-5.3.4-win32.msi

      2. **兼容性**:由于 ODBC 是一个标准接口,所以任何支持 ODBC 的应用程序都可以通过 MySQL Connector/ODBC 访问 MySQL 数据库,无论是 Visual Basic、C++、Python 还是其他编程语言。 3. **性能优化**:该驱动程序...

      mysql-connector-odbc-5.3.9-win32和VC2013

      MySQL Connector/ODBC 是 MySQL 数据库管理系统与 ODBC(Open Database Connectivity)之间的桥梁,它允许 Windows 上的应用程序通过 ODBC 接口与 MySQL 数据库进行交互。标题中的 "mysql-connector-odbc-5.3.9-win...

      mysql-connector-odbc-5.1.5-win32

      在实际应用中,MySQL Connector/ODBC可以被各种编程语言使用,比如Python、C++、Visual Basic等,它们通过ODBC API来访问MySQL数据库。开发人员可以在应用程序中设置ODBC数据源,然后通过DSN(数据源名称)来连接到...

      mysql-connector-odbc-5.3.10-win32.rar

      MySQL Connector/ODBC的主要功能是提供一个统一的接口,使得各种编程语言(如Visual Basic、C++、VBScript等)可以无需关心MySQL数据库的内部实现,而直接通过ODBC标准进行数据存取。ODBC是微软为Windows环境开发的...

      mysql-connector-odbc-5.3.9-win32.msi

      7. **易于集成**:适用于各种编程语言,如 C++, Visual Basic, Python, PHP 等,只要这些语言支持 ODBC,就可以方便地接入 MySQL 数据库。 在安装 `mysql-connector-odbc-5.3.9-win32.msi` 时,系统会自动将所需的 ...

      Mysql-Connector-ODBC-5.3.8-x86-x64(含VC2013运行库)

      MySQL Connector/ODBC 是 MySQL 数据库管理系统与 Microsoft Windows 上的应用程序之间...正确安装并配置这些组件,可以确保你的应用程序能够顺利地连接到 MySQL 数据库,执行查询,处理事务,以及进行其他数据库操作。

      mysql-connector-odbc-8.0.17-winx64.rar

      在实际开发中,MySQL Connector/ODBC 可以与多种编程环境结合,例如在 Visual Studio 中创建基于 .NET 的应用程序,或者在 Python 中通过 pyodbc 库进行数据库操作。它不仅适用于开发新项目,也方便已有应用迁移至 ...

      Mysql-Connector-ODBC-5.3.8_64位及VC2013运行库64位.rar

      这个压缩包"**Mysql-Connector-ODBC-5.3.8_64位及VC2013运行库64位.rar**"包含了64位版本的MySQL Connector/ODBC 5.3.8驱动程序,以及适用于64位系统的Microsoft Visual C++ 2013运行库。 首先,让我们深入了解...

      mysql-connector-odbc-5.3.8-win32

      综上所述,`mysql-connector-odbc-5.3.8-win32` 是一个用于 32 位 Windows 系统的 MySQL ODBC 驱动,它简化了多种编程语言与 MySQL 数据库的交互,并提供了稳定可靠的连接方式。正确安装和配置此驱动,可以帮助...

      mysql-connector-odbc-5.1.13-win32

      MySQL Connector/ODBC 就是 MySQL 对这一标准的实现,使得开发者可以使用支持 ODBC 的任何应用程序连接到 MySQL 数据库,如 Microsoft Excel、Visual Basic 或者其他编程语言(如 Python、C++)的 ODBC 驱动程序管理...

      mysql-connector-odbc-5.1.8-win32.msi

      connector-odbc-5.1.8-win32.msi" 文件是用于在 Windows 32 位系统上安装 MySQL ODBC 驱动程序的软件包,它提供了通过 ODBC 访问 MySQL 数据库的能力,使得各种应用程序能够方便、高效地与 MySQL 数据库进行通信。

      mysql-connector-odbc-5.1.7-win32

      "mysql-connector-odbc-5.1.7-win32" 提供了在 Windows 平台上通过 ODBC 连接 MySQL 数据库的能力,而 "mysql 反向工程" 是一个数据库设计理解与分析的过程,两者结合使用,可以帮助开发者更高效地进行数据库相关的...

      mysql-connector-odbc-5.1.5-win32.rar

      MySQL Connector/ODBC 提供了标准的 ODBC API,使得开发人员无需了解 MySQL 的特定细节,就能在支持 ODBC 的各种编程语言(如 C++, Visual Basic, Python 等)中连接和操作 MySQL 数据库。 标题 "mysql-connector-...

      mysql-connector-odbc-noinstall-5.3.11-winx64.zip

      - 一旦配置好 ODBC 数据源,任何支持 ODBC 的应用程序(如 Microsoft Excel、Visual Studio 或其他开发工具)都可以通过该数据源连接到 MySQL 数据库,进行数据查询、插入、更新和删除操作。 8. **兼容性与安全性*...

      mysql-connector-odbc-5.3.4-win32.7z

      1. **兼容性**:它支持多种编程语言,如 Visual Basic、VB.NET、C++、Python、PHP 等,这些语言可以通过 ODBC API 访问 MySQL 数据库。 2. **数据源创建**:用户可以创建并管理 Data Source Name (DSN),使得应用...

      mysql-connector-odbc-3.51.12-win32

      8. **应用集成**:许多流行的开发工具和编程语言,如Visual Studio、Python、C++、VB.NET等,都支持ODBC接口,因此可以通过MySQL Connector/ODBC轻松地在这些环境中连接MySQL数据库。 总的来说,MySQL Connector/...

      Visual C++数据库开发经典实例精解.pdf

      Visual C++数据库开发是面向数据库编程的一个领域,主要侧重于使用Visual C++这一强大的编程工具进行数据库的应用程序开发。数据库可以是关系型的,比如SQL Server、MySQL等,或者非关系型的如NoSQL数据库。通过...

      mysql-connector-odbc-noinstall-3.51.30-winx64.zip

      使用 MySQL Connector/ODBC,开发者可以在各种支持 ODBC 的环境中,例如 Visual Basic、Delphi、C++ Builder 或者 Python(通过 pyodbc 模块)等,建立与 MySQL 数据库的连接。为了连接数据库,开发者需要创建一个 ...

      mysql-connector-odbc\VC_redist\

      这个接口允许程序员通过标准的ODBC API来访问MySQL数据库,使得不同编程语言可以方便地与MySQL进行交互。本文将详细介绍MySQL Connector/ODBC和其在Windows环境中的安装过程。 标题中的“mysql-connector-odbc\VC_...

      MYSQL-ODBC-win32相关依赖

      包含 visual c++2010, visual c++2013, visual c++2015,mysql-connector-odbc-5.1.13-win32。都是windows32位的。 全部安装后,可以支持MYSQL 5.7.25的ODBC数据源配置

    Global site tag (gtag.js) - Google Analytics