首页 > 解决方案 > 如何在 MFC 中导出 mysql 结果(选择数据)

问题描述

我在使用 MFC 执行选择查询后导出 .csv

我通过 Visual C++ 6.0 和 MySQL Server 5.X 使用 MFC

MYSQL_RES m_res = mysql_store_result(&mysql);

我不知道如何使用 m_res 连接导出 .csv

可以导出数据吗?如果不是,我会在显示gridview后通过.csv导出数据。

标签: c++mysqlmfc

解决方案


这是一个示例,使用 MFC 方式(CString/CStringList、CArchive 等):

    void PrintListCSV( CArchive &archiveContent, CStringList & strList, CString szSeparator ){

            if( strList.IsEmpty() )
                    return;

            CString strOneRecord;

            POSITION posTail = GetTailPosition();
            POSITION pos;

            for( pos = strList.GetHeadPosition(); pos != posTail; )
            {
                    CString str = strList.GetNext( pos );
                    strOneRecord += str;
                    strOneRecord += szSeparator;
            }

            strOneRecord += strList.GetNext( postTail );
            strOneRecord += _T("\r\n"); // windows change a line
            archiveContent.WriteString(strOneRecord);
    }


    BOOL ExportCSV( CString strFileName, MYSQL_RES * mysql_res )
    {
            CFile filePersistent;
            if( !filePersistent.Open( strFileName, CFile::modeCreate | CFile::modeWrite))
            {
                    //Error log, message box, etc.
                    return FALSE;
            }

            CArchive archiveContent( &filePersistent, CArchive::store);
            CString strSeparator(_T(";"));

            MYSQL_FIELD *field;

            //print column name - optional 
            CStringList fieldList;
            unsigned int num_fields = mysql_num_fields(mysql_res);

            while((field = mysql_fetch_field(mysql_res)) != NULL )
            {
                    fieldList.AddTail( field->name );
            }

            PrintListCSV( archiveContent, fieldList, strSeparator );

            //print each record set
            while ((row = mysql_fetch_row(mysql_res)))
            {
                    CStringList recordList;
                    for(i = 0; i < num_fields; i++)
                    {
                            recordList.AddTail( row[i] ? row[i] : "NULL" );
                    }

                    PrintListCSV( archiveContent, recordList, strSeparator );
            }

            archiveContent.Close();
            filePersistent.Close();

            return TRUE;
    }

如何使用:

    //some where in your main function ...
    //Open mysql connection, execute SQL commande ...
    // ...

    MYSQL_RES *m_res = mysql_store_result(&mysql);
    CString szFileName("C:\\SOME_PATH\\FILENAME.csv");

    if( !ExportCSV( szFileName, m_res ) ){
            //Cannot export to CSV file ...
            //Error message, log, etc.
    }

    //free the SQL result
    mysql_free_result( m_res );

    //...

警告:此代码可能包含编译器错误。希望我的记忆对我有用。


推荐阅读