Zum Inhalt springen

Erstellen eines neuen Feldes mit Visual Studio 6


aifl

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 !

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...