Вот пример использования 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 );
//...
Предупреждение: Этот код может содержать ошибки компилятора.Надеюсь, что моя память мне не изменяет.