[Access Datenbank] einen Datensatz "senden"



  • Hallo, wie es der Titel bereits verrät habe ich eine Access Datenbank und möchte gern einen kompletten Datensatz aus meiner C++ Anwendung in die Datendank einfügen.
    Vorraussetzungen: Die Verbindung zur Datenbank steht, in einem Recordset liegen die Abfrageergebnisse, welche auf eine andere Datenbank übertragen werden sollen. Also im Klartext, ich habe eigentlich 2 Datenbanken. Eine von welcher ich die Abfrage mache und eine (am Anfang leere) in welche ich die Abfrageergebnisse einfügen möchte. Realisiert habe ich dies bis jetzt mit ADO wo mir die Klassen CADODatabase, CADORecordset und CADOCommand zur Verfügung stehen (und noch ein paar kleinere).
    Nun weiß ich das ein CADODatabase Objekt eine "Execute" Methode hat, welche einen String erwartet. Bereits probiert, funktionierte aber nicht. Zudem weiß ich das ein Objekt der Klasse CADORecordset ebenfalls diese "Execute" Methode ausführen kann, hierfür jedoch ein Objekt der Klasse CADOCommand erwartet. Probiert, aber schnell wieder verworfen, da ich es nicht gescheit hinbekommen hab. Meine bisherige Notlösung ist also folgende: Ich habe 2 offene Verbindungen zu 2 Datenbanken, 2 Recordsets (jeweils 1 pro DB) und ich übertrage feld für feld von dem einen Recordset ins nächste und übertrage es auf die Tabelle in der 2. DB mit Hilfe der .Update() Methode des Recordsets. Da diese Methode bei Tabellen mit mehr als 3 Spalten jedoch sehr sehr mühsam ist, würde ich mich freuen, wenn mir jemand sagen könnte wie genau ich es realisiere das ich einen kompletten Datensatz auf einmal übertragen kann.

    Anmerkung: Die beiden DB's sind identisch sowie deren Tabellen(gleiche Anzahl v. Spalten)

    Danke fürs Lesen, und ein großes Danke im Vorraus für eure konstruktiven Antworten.

    Grüße,
    inva



  • Vorschlag: Bau dir einen INSERT SQL dynamisch anhand der Felder deines Recordsets zusammen.
    Über die Felder findest du in der Regel den Spaltennamem und den Wert. Dadurch solltest du in der Lage sein dir den SQL zusammenzubauen wie du ihn brauchst. Voraussetzung ist natürlich, dass auf deiner Ziel-DB eben eine solche Tabelle mit den gleichen Spaltennamen existiert.

    Schau ausserdem mal ob du nicht so etwas wie eine ADOQuery Komponente zur Verfügung hast, die sollte für solche Aktionen etwas komfortabler zu verwenden sein.



  • Die Option SQL Insert Into Statement habe ich bereits ausprobiert und er meldet mir unverständlicherweise bei einem vollkommen richtigem SQL Statement einen Syntaxfehler in der Insert Into Anweisung, nachdem ich dies mehrmals und auf verschiedene Art und weisen probierte, gab ichs auf. Aber die Idee mit dem ADOQuery werde ich aufgreifen. Danke! 🙂



  • Hast du diesen INSERT SQL mal direkt auf der Datenbank ausgeführt?
    Da kannst den SQL natürlich auch gern hier posten. Vielleicht lässt sich der Syntax Fehler finden.
    Zumindest könntest du dann weiterhin diese Methode für dein Problem verwenden.



  • Ja ich habs direkt an die Datenbank geschickt.
    Hier der String:

    strQuery = "INSERT INTO Data (User,Password,Age,EmailAddress) VALUES ("+strUser+","+strPassword+","+strAge+","+strEmailAddress+")";
    
    m_Backup_DB.Execute(strQuery);
    

    So ungefähr müßte er gewesen sein. Zumindest habe ich extra noch nach genauen Syntax gegoogled gehabt bevor ichs das erstemal verwendete.

    Eine andere Möglichkeit wäre natürlich auch es so zu lösen:
    http://www.codersource.net/mfc_ado_insert.html



  • inva schrieb:

    Ja ich habs direkt an die Datenbank geschickt.

    Ich meinte egtl ob du es direkt in Access ausgeführt hast. Wenn ja, dann müssten in dem SQL nämlich schon die endgültigen Werte drin stehen und nicht die Variablen ... aber nicht so wild, hab glaub ich eh deinen Fehler entdeckt

    inva schrieb:

    strQuery = "INSERT INTO Data (User,Password,Age,EmailAddress) VALUES ("+strUser+","+strPassword+","+strAge+","+strEmailAddress+")";
    
    m_Backup_DB.Execute(strQuery);
    

    Ich vermute mal die Felder welche du hier füllst sind Strings (also char, varchar...). Dann musst du im SQL ein Hochkomma vor die Feldwerte setzen, also:

    INSERT INTO Data (User,Password,Age,EmailAddress) VALUES ('"+strUser+"','"+strPassword+"',"+strAge+",'"+strEmailAddress+"')

    Da Age wohl numerisch sein dürfte hier kein Hochkomma.

    inva schrieb:

    Eine andere Möglichkeit wäre natürlich auch es so zu lösen:
    http://www.codersource.net/mfc_ado_insert.html

    Also das entspricht egtl nicht dem Problem, so wie ich es zumindest verstanden hatte. In dem Beispiel werden die Feldnamen nämlich noch einzeln angegeben.

    Ich hatte das so verstanden, dass du ohne die Feldnamen einzeln abtippen zu müssen, du nur anhand deines RecordSets Daten in eine Zieltabelle hinzufügen möchtest. Der SQL, welchen wir da oben im Übrigen behandelt haben dürfte dann wohl auch nicht der eigtl Lösungsidee entsprechen.

    Was ich meinte, war das iterieren über alle gefundenen Spalten im RecordSet und dann ein Zusammenbauen des SQLs anhand der gefundenen Spaltennamen. Dadurch hättest dir das abtippen der Spaltennamen nämlich erspart. Aber du kannst das natürlich auch so lösen. 😉



  • Also du meinst ich sollte die Spaltennamen aus meinem Recordset auslesen?
    Auch eine gute Idee, jedoch brauch ich das nicht zwangsweise, da ich zwei identische DB's mit identischen tabellen hab und somit weiß welche spaltennamenvorhanden sind. Der einzige Unterschied ist das die eine DB voll und die andere leer ist. Die 2. DB soll ebend als Backup DB dienen.

    Das mit den Hochkomma's hab ich bereits ausprobiert. Und meine Variablen sind CString Elemente, liegts vielleicht daran? Die Felder in der DB sollten eigentlich "Text" verstehen können, zumindest waren sie so eingestellt.
    Nein direkt in Access hab ichs nicht ausgeführt, ich habe es einfach als SQL Statement an die DB gesendet. Komisch ist das Abfragen ohne Probleme in der SQL Syntax funktionieren, nur Anfragen irgendwie nicht. Hat Access eine spezielle SQL Syntax?



  • Die *.mdb kopieren kommt zufällig nicht als Backup in Frage ?



  • Nein, das kopieren ist ja nur eine teilfunktion der APP 🙂
    Zudem sollen nicht immer alle Datensätze kopiert werden, sondern nur der Teil der einem gewissem Kriterium unterliegt.
    Aber danke für die guten Denkanstöße, denen werde ich erstmal nachgehen, dafür vielen Dank 🙂



  • strQuery = "INSERT INTO Data (User,Password,Age,EmailAddress) VALUES ("+strUser+","+strPassword+","+strAge+","+strEmailAddress+")";
    
    m_Backup_DB.Execute(strQuery);
    

    Nur so eine Idee aber ich glaub Access braucht hinter jedem Query einen ';'.
    Also gehts vielleicht so

    strQuery = "INSERT INTO Data (User,Password,Age,EmailAddress) VALUES ("+strUser+","+strPassword+","+strAge+","+strEmailAddress+");";
    
    m_Backup_DB.Execute(strQuery);
    

    Grüsse
    Tobi



  • Hallo, ich habe nun etwas rumprobiert und stehe nun in meinem code an der Stelle mit der Insert Into Anweisung, und ich bekomme immernoch wie vorher einen Syntaxfehler in der Instert Into Anweisung ... Jedoch mache ich meines erachtens nichts falsch

    INSERT INTO Image (...,...,...,...,...) VALUES (...,...,...,...,...);
    

    Es handelt sich bei jedem Element um einen CString, sieht vielleicht jemand von euch den Fehler?



  • inva schrieb:

    Es handelt sich bei jedem Element um einen CString, sieht vielleicht jemand von euch den Fehler?

    Die Verwendung von Hochkommas innerhalb von SQL Anweisungen ist abhängig von dem Feldtyp welcher auf der Datenbank angelegt wurde, nicht vom Datentyp innerhalb deines Programmes.



  • Jau, Fehler gefunden, die Abfrage bzw. das senden des Datensatzes klappt wunderbar! Es haben einfach nur in dem VALUES(...) Teil die Hochkomma's gefehlt. Danke an dieser Stelle, Problem behoben 🙂


Anmelden zum Antworten