CRecordset und Excel
-
moin moin,
ich habe eine von CRecordset abgeleitete Klasse mit deren Hilfe ich auf eine Excel-Tabelle zugreife. Registrierung und Auslesen ist kein Problem, aber schreiben kann ich noch nicht (und das in meinem Alter).
Wenn ich folgendermaßen versuche etwas in die Tabelle zu schreiben, bekommen ich die Meldung "Recordset is read-only":CTankDatenSet* tankdatenset = new CTankDatenSet(NULL); if(tankdatenset->IsOpen() == false) tankdatenset->Open(CRecordset::dynaset, NULL, CRecordset::none); tankdatenset->MoveFirst(); tankdatenset->Edit(); tankdatenset->m_Firma = "blabla"; tankdatenset->Update();
Ausgelöst wird die Meldung durch Edit(), allerdings ist mir schleierhaft warum (ich habe auf dem gleichen Weg schon ohne Probleme mit einer Access-Datenbank gearbeitet). Was muss ich also tun, um in meiner Excel-Tabelle zu schreiben?
Besten dank im voraus
-
Hmm, ich weiss nicht wie es hier gemacht wird. Aber normalerweise muss der Datensatz gesperrt werden, bevor man ihn schreiben kann.
Schau dir mal die Funktion SetLockingMode an. Wie gesagt ist nur so eine Idee. Aber das könnte es sein.
-
danke, aber
tankdatenset->SetLockingMode(CRecordset::optimistic);
bringt nichts und 'pessimistic' wird nicht unterstützt.
-
Mach dir um das Edit() mal eine Try-Catch Konstruktion. Das zurückgegebene CDBException Objekt sollte dir eine aussagekräftige Fehlermeldung liefern
-
OK hab ich getan und bekomme folgende ergebnisse:
e->m_nRetCode = 1009 (AFX_SQL_ERROR_RECORDSET_READONLY)
e->m_strError = Recordset is read-only
e->m_strStateNativeOrigin = ""
-
so, ich habe meine excel-tabelle inzwischen mit der klasse CSpreadSheet (http://www.codeguru.com/Cpp/data/mfc_database/microsoftexcel/article.php/c4307) in den griff bekommen.
kleines beispiel:
// erzeugt neue excel-tabelle "Tankdaten.xls" // mit tabellen-blatt "Tankdaten" CSpreadSheet tabelle("C:\\Tankdaten.xls", "Tankdaten"); CStringArray kopf, zeile; // vorgang einleiten tabelle.BeginTransaction(); kopf.RemoveAll(); zeile.RemoveAll(); // spaltenüberschriften kopf.Add("Datum"); kopf.Add("Uhrzeit"); kopf.Add("Tankstelle"); kopf.Add("Firma"); kopf.Add("Techniker"); kopf.Add("Volumen"); // spaltenüberschriften einfügen tabelle.AddHeaders(kopf, true); // zeile zeile.Add("01.01.2004"); zeile.Add("10:56"); zeile.Add("Zapfsäule 1"); zeile.Add("ABC"); zeile.Add("Mustermann"); zeile.Add("372"); // zeile einfügen tabelle.AddRow(zeile, 2, false); // erzeugt "Tankdaten.csv" tabelle.Convert(";"); // vorgang abschließen // änderungen in tabelle speichern tabelle.Commit();
das schöne dabei ist, daß man sich den ganzen krempel mit der registrierung auch noch erspart.
schöne grüße nochmal an cpp-junky
olsen