aifl Geschrieben 27. Februar 2002 Geschrieben 27. Februar 2002 Hi Leute, Es gibt eine Accessdatei. Ich will mit MFC ein neues Feld erzeugen (AddNew), dahin PersonalNr und die Zeit reinschreiben (p_Mitarbeiter->strPNR und p_Mitarbeiter->strZeit) nach dem Ausführen wird beim letzten Eintrag (der schon vorher existierte) im Feld "PNR" die PersonalNr weg (leeres Feld) und im Feld "Zeit" meine neue Zeit, die ich eigentlich im neuen Feld haben wollte. Könnte mir das jemand erklären? CQuelldatei::PNR_Anlegen(struct Personalien *p_Mitarbeiter, CDaoRecordset *p_rs) { COleVariant olevar_PNR, olevar_Zeit; p_rs->MoveLast(); int iPNR=atoi(p_Mitarbeiter->strPNR); olevar_PNR.intVal=iPNR; COleDateTime time; time.ParseDateTime(p_Mitarbeiter->strZeit); olevar_Zeit = time; p_rs->AddNew(); p_rs->Edit(); p_rs->SetFieldValue("PNR",olevar_PNR); p_rs->SetFieldValue("Zeitpunkt",time); p_rs->Update(); } Danke im voraus! aifl Zitieren
gugelhupf Geschrieben 27. Februar 2002 Geschrieben 27. Februar 2002 Kann ich auf die Schnelle nicht beantworten, aber ich mach sowas grunsätzlich nicht mit CRecordset-Objs. Probiers einfach mal mit einem CDatabase Objekt. CDatabase test; CString SQLstr="INSERT INTO bla.bla.bla..."; test.Open(//ODBC-Quellenname//); test.ExecuteSQL(SQLstr); test.Close(); Hab mir sagen lassen, dass sei wesentlich schneller als der indirekte Aufruf über das CRecordset ! Zitieren
Crush Geschrieben 27. Februar 2002 Geschrieben 27. Februar 2002 Ich kann eigentlich keinen Fehler finden. Versuch mal auf die Harte Tour keine OleVarianten zu schreiben, sondern direkt Strings zu setzen, ob das auch nur ein leeres Feld ergibt. Nach AddNew() braucht man das Edit() glaub gar nicht -> sollte automatisch auf den aktuellen Datensatz gestellt werden, weshalb auch der MoveLast() u.U. überflüssig ist. Beachten: "Caution If you edit a record and then scroll to another record without calling Update, your changes are lost without warning." Erst Requery() erlaubt es die richtigen neuen Inhalte im Nachhinein auszulesen. Vielleicht frägst Du ohne Requery erneut ab und erhälst dann den Inhalt des Feldes vor dem Ausfüllen! Und hier vielleicht noch eine Fehlerquelle: Handelt es sich um einen Dynaset ist mit movelast() nicht garantiert, wo der richtige Record eingefügt wird. Das soll sich zwar später geändert haben, aber richtig sicher gehen, wo die Daten sich befinden, kann man nur indem man dort direkt nach dem Update(), bzw. them MoveLast() einmal nachhakt: rs.SetBookmark( rs.GetLastModifiedBookmark( ) ); // anstatt MoveLast() und dann erst den Edit() ausführt. Bestimmt arbeits Du mit einem Dynaset - und das scheint ja etwas empfindlich zu sein in der Zugriffs- & Update-Methode. Bei Tabellen wird nach dem Index geschaut - ist dieser nicht angegeben wird immer korrekt beim letzten Datensatz eingefügt. Ich bin mir auch nicht ganz sicher, woran es nun wirklich liegt, aber in der Doku wird auf diese Dinge hingewiesen. Versuch Dich mal so durch. Mein Abschlußprojekt habe ich auch mit Recordsets gemacht und es gab überhaupt keine Probleme. Nur leider weiß ich auch nicht mehr auf welcher meiner 1000 CDs der Source davon noch ist... sonst hätte ich mal nachgeschaut. Bei Zugriffen habe ich beide Versionen (also wie Gugelhupf und Deine) mal gebenchmarked und der Recordset war eindeutig schneller. (mehrere hunderttausend Zugriffe pro Sekunde auf Oracle, wenn ich mich noch recht entsinne - die Testdatenbank war ein paar Millionen Einträge groß). Es ist vielleicht schneller zu programmieren, aber nicht schneller im Ablauf. Die schnellste Methode ist der Zugriff über Datenbank-eigene Schnittstellen. Am allerschnellsten sind bei Oracle nämlich: T-Net (auch recht einfach) & OCI (schweinekompliziert - erlaubt aber extreme Beschleunigungsmethoden). Schreib zurück, wenn´s klappt oder auch nicht... Zitieren
aifl Geschrieben 1. März 2002 Autor Geschrieben 1. März 2002 Jetzt erstellt er mir neue Zeile (lag am Edit) und schreibt auch die Zeit rein, nur mit PNR kriege ich immernoch Probleme. Beim Zuweisen olevar_PNR.intVal=iPNR zeigt mir Debugger {-21092 VT_I2} und schreibt auch schließlich -21092 in Feld "PNR" rein. Habe versucht mit olevar_PNR=(short) iPNR; - war dasselbe Ergebnis. Kapiere nicht wieso... { COleVariant olevar_PNR, olevar_Zeit; int iPNR=atoi(p_Mitarbeiter->strPNR); olevar_PNR.vt=VT_I2; olevar_PNR.intVal=iPNR; COleDateTime time; p_rs->MoveLast(); time.ParseDateTime(p_Mitarbeiter->strZeit); olevar_Zeit = time; if (p_rs->CanUpdate()!=NULL) { p_rs->AddNew(); p_rs->SetFieldValue("Zeitpunkt",time); p_rs->SetFieldValue("PNR",olevar_PNR); p_rs->Update(); } }:confused: Zitieren
Klotzkopp Geschrieben 1. März 2002 Geschrieben 1. März 2002 Versuchs doch mal mit unsigned short oder setzt den Typ auf VT_UI2. Zitieren
aifl Geschrieben 1. März 2002 Autor Geschrieben 1. März 2002 hab ich - schmiert ab. Wenn exe startest, sagt: "Nicht genügend Arbeitsspeicher" aifl Zitieren
aifl Geschrieben 1. März 2002 Autor Geschrieben 1. März 2002 Ich hab´s!!! - glaub dummer geht´s nicht mehr... für die Zahl in PNR habe ich 44444 genommen - und das ist long integer und kein short........ O Mann! thanx @ all! aifl Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.