ODBC - Werte in Datenbank schreiben



  • Ich hab mich da auch mal durchdebuggt.

    Die ? sind Platzhalter für die Feldwerte und ich glaube, man konnte nicht in die Funktion reingucken, wo die ersetzt werden.
    Bastel dir doch den Update-String selber und schick ihn runter. 😃 Nur für den Fall, dass es gar nicht geht.

    Mich hatte es ganz zu Anfang auch sehr genervt, dass man für jede Tabelle eine Klasse machen muss. Mittlerweile habe ich mich damit abgefunden und kann damit auch gut leben. 🙂



  • Das kommt gar nicht in Frage, das ich pro Tabelle eine Klasse bastel 😡
    Wenn ich das Update manuell abschicke bekomm ich übrigens auch ne Accesss-Violation.
    Ach ja, ich hab mal an der Stelle geguckt wo die Platzhalter ersetzt werden sollten. Dort kommt zwar die richtige Variable aus dem Recordset rüber aber trotzdem tauscht er das ? nicht durch den Variablen-Inhalt aus 😕
    Müssen die Variablen in RFX_Text auf einen bestimmten Datentyp gecastet sein damit die Funktion was damit anfangen kann ? Ich übergebe CString, so wie ja eigentlich auch in der Funktion vorgesehen.



  • Nur mal so, um meinen Lieblingsfehler auszuschließen:
    Ist das Recordset offen?

    Funktioniert es denn überhaupt, wenn du das Set an eine Tabelle knüpfst? (Mit eben gerade den nötigen Änderungen?)
    Sonst ist der Fehler woanders.



  • Hm, hab das ganze nochmal mit einer vom Klassen-Assi generierten CRecordset "hardgebundenen" Klasse getestet und es geht. Scheint wohl an meiner dynamischen CRecordset-Klasse zu liegen 🙄
    Das Problem ist wahrscheinlich, das ich zum Zeitpunkt des Open() nicht weiss, wie viele Felder ich bekomme und pauschal 255 übergebe 😃 Bis zum Update()funktioniert das sogar 🙄
    Ich müsste irgendwie vorher rausfinden, wie die Tabellenstruktur aussieht.
    Wie lautet der Befehl unter SQL ? Unter Oracle geht es mit "desc [TabellenName]". Aber das scheint kein Standard-SQL zu sein.
    Und selbst dann, bekomme ich nur Infos über eine Tabelle. Was ist, wenn ich einen Join abfrage ? Oder einen View ? 😕
    ODBC fängt an, mich anzunerven 😡



  • Wann könntest du das denn mit dem Recordset herausfinden?
    Kann man überhaupt ein Update in einem Joined-View machen? (Ich glaub, da war ein Haken...)

    Ich hab hier einen MS-SQL Server, da würde ich dich mal in deiner Datenbank in die syscolumns-Tabelle gucken lassen. 🙂

    Es MUSS irgendwo eine Systemtabelle geben, wo das drin steht.



  • Nein, einen Joint-View kann man natürlich nicht updaten. Aber um die Daten daraus einigermaßen plausibel ins Recordset zu bekommen muss man ja vorher wissen, wie viele Felder da auf einen zukommen.



  • Geht denn ein Select auf die zu-updatende Tabelle?
    Und kannst du dann herausfinden, wieviele Felder die hat?
    Dann würde ich das vorher einfach abfragen und dann mit den korrekten Daten erneut abfragen.

    Oder eben mit einem "select count(wasauchimmer) from syscolumns where ???" oder so ähnlich.

    Oder, als endgültige Krücke würde ich solche Daten irgendwo speichern, in einer Tabelle z.B. wo nur Tabellenname und Feldanzahl drinsteht.
    Die kannst du zum Start einmal abfragen und weißt dann eben alles. 🙂



  • Hm, neues Phänomen 😃
    Wenn ich die Tabelle mit "select * from tabellenname" öffne und dann mit Edit() und Update() einen Wert speichere funktioniert es plötzlich! 😕
    Wenn ich aber eine "Where-Bedindung" anhänge, oder mit MoveNext einen Satz weiter-skippe bekomme ich beim Schreiben den Fehler "Es wurden mehrere Zeilen aktualisiert". Was ist das nun wieder ? 😕



  • Die Tabelle hat keinen Primärschlüssel.



  • Hm, ich dachte dafür wäre ein Cursor da ?! 😕 🙄
    Jetzt gehts! Auch mit where und dynamischer Recordset-Klasse und allem anderen! 👍 Danke leute!



  • Hallo nochmal!

    Suchst du noch den desc Befehl? Und verwendest MS-SQL Server?
    Dann hab ich was gefunden. Hab hier ein Buch vor mir, da steht das drinne.
    Transact-SQL | ISBN: 3827319242ab S. 521 🙂



  • desc?

    War doch gar nie gefragt! 😕

    😃



  • Cpp_Junky schrieb:

    Ich müsste irgendwie vorher rausfinden, wie die Tabellenstruktur aussieht.
    Wie lautet der Befehl unter SQL ? Unter Oracle geht es mit "desc [TabellenName]".

    🙄



  • *gg* nimm ja schon alles zurück!
    😃



  • estartu_de schrieb:

    ...
    Suchst du noch den desc Befehl? Und verwendest MS-SQL Server?
    ...
    Transact-SQL | ISBN: 3827319242ab S. 521 🙂

    Ne, ich verwende zum testen FireBird. Eigentlich aber soll die Anwendung mit allen ODBC Datenbanken verwendbar sein. Deshalb brauch ich irgendeinen SQL-konformen Standard-Befehl für sowas. Gibts den ?



  • Ich fürchte nein. Sowas ist systembedingt und daher sehr unterschiedlich.

    Schau mal da: http://www.c-plusplus.net/forum/viewtopic-var-t-is-111466.html
    Da ging es zwar um Tabellen, aber du kannst schön sehen, WIE unterschiedlich es ist.

    Eine Möglichkeit wäre noch, eine gespeicherte Prozedur zu machen, die man dann eben je nach DBMS anders füllt, die aber immer gleich heißt. Das ist aber wieder etwas eigenes und ich glaube, das wolltest du nicht. 😞

    Tip am Rande:
    Wenn du das "für alle" haben willst, musst du noch an vielen anderen Stellen aufpassen. Meine letzte grosse Falle waren Datum-Zeit-Felder:
    Pervasive kann Date, Time und DateTime (oder so ähnlich)
    MS-SQL kann Timestamp.
    DAS hat geknallt... 🙄



  • Hmm, ja. Nagut, mach ich erstmal so weiter.
    Hab hier zum Schluss noch ein kleines Problem mit der Feldlänge.
    Über GetODBCFieldInfo kann ich mir Feldeigenschaften holen. In der zurückgegebenen Struktur gibt es zwei Werte "Precision" und "Scale".
    "Scale" gibt die Nachkomma-Länge an, aber Precision stimmt bei numerischen Feldern nicht mit der Länge überein, die ich in der Datenbank angelegt habe 😕


Anmelden zum Antworten