Dynamisch eine neue Spalte in der DB generieren



  • Tach zusammen,
    ich hätt da mal ne Frage bezüglich der generierung bzw. erstellung neuer Spalten in meiner MySQL DB während der Laufzeit.
    Ich benutzte eine MySQL DB und Programmiere mit VC++ mit dem MFC. DB öffnen mit open, hinzufügen von Zwilen mit Add und Editieren der DB mit dem Edit befehl geht alles. Ich weiß nur nicht wie man zur Laufzeit eine neue Spalte in der DB erzeugen könnte?? 😕
    Hat da vielleicht jemand Rat!?!?!

    BIG THX im voraus !!!

    Slawo



  • Per SQL: ALTER TABLE xxx ADD COLUMN xyz <Spaltentyp> [constraints]



  • @ Joe_M:

    Muss ich da noch was spezieles includieren für oder wie soll ich das anstellen? Also ich schätze ich muß zunächst die DB öffnen und dann SQL: ALTER TABLE xxx ADD COLUMN xyz <Spaltentyp> [constraints] drauf loslassen. Seh ich das richtig? Wiel wenn ich SQL: eintippe, tut sich nix, sprich es öffnet sich keine Liste mit nem auswahlmenü oder ähnliches, wie man das sonst so gewohnt ist 😕 .
    Hättest du da evtl. ein konkretes Beispiel für ??



  • Du mußt das als SQL-Statement an die Datenbank absetzen. Wie das zu geschehen hat, hängt von der Datenbank, respektive von den Zugriffskomponenten oder den verwendeten Wrapperklassen ab.

    xxx wäre die zu ändernde Tabelle
    xyz wäre der neue Spaltenname
    <Spaltentyp> der Typ für die Spalte, also VARCHAR oder INTEGER
    [constraints] ist optional und kann Dinge wie z.B. Default-Werte enthalten.

    [EDIT] MFC mach ich einen großen Bogen drum, da muß Dir jemand anders mit der genauen Syntax helfen...



  • @ Joe_M:

    Alles klar, danke dir trotzdem !!! 👍

    Evtl. hat jmd. anders noch nen Vorschlag, im moment hab ich sowas:

    CDatabase db;
    CDBSet cdb(&db);
    cdb.Open(CRecordset::forwardOnly,_T("ALTER TABLE") + pMainDoc->m_strDBTabelle + ("ADD COLUMN") + m_MittAbw_45 <long>);
    

    mit folgender Fehlerausgabe:

    **error C2062: 'long'-Typ unerwartet
    error C2065: 'm_MittAbw_45': nichtdeklarierter Bezeichner
    error C2593: 'Operator +' ist mehrdeutig
    **

    Wobei m_MittAbw_45 die neue Spalte darstellen soll.

    Hat jmd. eine Idee ?? 😕



  • RecordSet dürfte nicht funktionieren, da Du kein ResultSet zurückerhälst, sondern einfach nur ein Statement absetzen willst. Gibt es da irgendwas in Richtung 'Command'?
    Die Typ muß ohne die <> angeben werden, das sollte nur verdeutlichen, dass dort verschiedene Werte als Typ angegeben werden können.
    Nehmen wir an, die Tabelle heißt Kunden und es soll eine Spalte AnzBest (Anzahl Bestellungen) mit dem Typ INTEGER hinzugefügt werden:

    ALTER TABLE Kunden ADD COLUMN AnzBest INTEGER
    

    Sofern der Tabellenname oder die neue Spalte Sonderzeichen oder Leerzeichen enthalten, müssen diese in Hochkommas gesetzt werden. Auf die Verwendung von Leerzeichen oder Sonderzeichen sollte allerdings grundsätzlich verzichtet werden.



  • Ok, soweit hab ich das verstanden, nur die klamotte mit dem MFC macht mir zu schaffen, weil das ganze Projekt in MFC ist und die DB anbindung von vorne rein per MFC geschehen ist. Somit weiß ich nicht wie ich das Statement absetzten soll!?!?!?!?! 😕 Google schon den ganzen Tag deswegen, aber da kommt nur das gleiche bei raus was du mir eben geschrieben hast, aber kein stück MFC-Code. Ich weiß auch nicht 😞 . Was meinst du denn mit 'Command'?



  • Du benutzt die Klasse CDatabase. Die besitzt die Funktion ExecuteSQL mit der man SQl-Statements abschicken kann. Steht mit Beispiel in der MSDN.



  • Das mit dem ExecuteSQL hört sich gut an!!!

    Hab jetzt folgendes gemacht:

    CDatabase db;
    CDBSet cdb(&db);
    CString strCmd = "ALTER TABLE tabelle_4 ADD COLUMN m_MittAbw_45 long";
    db.ExecuteSQL(strCmd);
    cdb.Close();
    db.Close();
    

    Aber genau bei ExecuteSQL stürzt er ab!!! Hmmm...

    tabelle_4 existiert wirklich, m_MittAbw_45 soll noch rein und soll vom typ long sein.

    MSDN hab ich gefunden, da steht ein kleines Beispiel für UPDATE und so, hilft mir jetzt nicht wirklich weiter. 😞

    JEMAND NOCH EINE IDEE was daran falsch sein könnte ?!?!?!?!



  • Vielleicht fehlen die entsprechenden Open() zu den Close().
    Vielleicht ist auch das COLUMN zu viel (ist z.B. bei Oracle nicht nötig, bei Access dagegen schon, keine Ahnung, wie bei MySQL ist...).

    Edit:
    ...oder die Datenbank kennt long nicht.
    Oracle: NUMBER(14,4) // 14 Stellen vor, vier nach dem Komma
    Access: NUMBER // ich glaube für double
    MySQL: keine Ahnung



  • Also so gehts wohl:

    CDatabase db;
    CDBSet cdb(&db);
    cdb.Open(CRecordset::forwardOnly,_T( "SELECT * FROM ") + tabelle_4);
    CString strCmd1 = "ALTER TABLE tabelle_4 ADD COLUMN MittAbw_45 int";
    CString strCmd2 = "UPDATE tabelle_4 SET MittAbw_45 = 0";
    db.ExecuteSQL(strCmd1);
    db.ExecuteSQL(strCmd2);
    cdb.Close();
    db.Close();
    

    Das cdb.Open hatte noch gefehlt!!! 🙂

    Vielen dank vorerst für eure Hilfe !!!! 👍 BIG UP !!!

    Slawo


Anmelden zum Antworten