February 17, 2004
Hittade till slut ett skript som passar till min uppgift, dvs att läsa en excelfil. Det är en MFC applikation i C++ med en knapp(läs) och ett textfönster. När man trycker på knappen läser den kolumner i excel-filen och skriver ut det i textfönstret. Detta fungerar bra när man endast läser 2 kolumner (genom en sql-query) i excel filen. När jag försöker skapa en query där den läser 3 kolumner klagar den på att för få parametrar angavs minst 1 krävs. Detta felmeddelande kommer när jag trycker på knappen läs. Alltså inget fel på koden. Mycket märkligt fel att hitta då felmedd är kryptiskt.
En sak till är märkligt; när jag utökar raderna i excel-filen skriver den bara ut 3 rader även fast filen ej är slut, while( !recset.IsEOF() )
Här är koden när man trycker på knappen:
void CReadExcelDlg::OnButton1()
{
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile = "C:ReadExcel.xls"; // the file name.
// Clear the contents of the listbox
m_ctrlList.ResetContent();
// Retrieve the name of the Excel driver. This is
// necessary because Microsoft tends to use language
// specific names like "Microsoft Excel Driver (*.xls)" versus
// "Microsoft Excel Treiber (*.xls)"
sDriver = GetExcelDriver();
if( sDriver.IsEmpty() )
{
// Blast! We didn´t find that driver!
AfxMessageBox("No Excel ODBC driver found");
return;
}
//Create a pseudo DSN including the name of the Driver and the Excel file
// so we don´t have to have an explicit DSN installed in our ODBC admin
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
TRY
{
// Open the database using the former created pseudo DSN
database.Open(NULL,false,false,sDsn);
// Allocate the recordset
CRecordset recset( &database );
// Build the SQL string
// Remember to name a section of data in the Excel sheet using "Insert->Names" to be
// able to work with the data like you would with a table in a "real" database. There
// may be more than one table contained in a worksheet.
sSql = "SELECT field_1, field_2 FROM demo_table ORDER BY field_1";
// Execute that query (implicitly by opening the recordset)
recset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);
// Browse the result
while( !recset.IsEOF() )
{
// Read the result line
recset.GetFieldValue("field_1",sItem1);
recset.GetFieldValue("field_2",sItem2);
// Insert result into the list
m_ctrlList.AddString( sItem1 + " --> "+sItem2 );
m_ctrlList.AddString("hallo");
// Skip to the next resultline
recset.MoveNext();
}
// Close the database
database.Close();
}
CATCH(CDBException, e)
{
// A database exception occured. Pop out the details...
AfxMessageBox("Database error: "+e->m_strError);
}
END_CATCH;
}
I sql-satsen vill jag läsa in en kolumn till, dvs field_3 men då ger den det mystiska felet. Är detta ett statiskt skript som bara kan läsa 3 rader och 2 kolumner tro?
1 Guest(s)