mysql update



  • Hallo!

    Ich habe ein Problem mit mySQL und habe auch überhaupt gar keinen Plan wie ich das Lösen kann.

    Ich möchte eine Abfrage machen, ob ein bestimmter Datensatz schon vorhanden ist, wenn das der Fall ist, dann soll er mit dem neuen (aus einer Variabel)überschrieben werden (Update).
    Wenn der Datensatz noch nicht vorhanden ist, soll er einen neuen erstellen.
    Nur mit Update scheint das nicht zu funktionieren, weil mySQL dann keine neuen Datensätze erstellt.

    Ich stehe irgendwie auf dem Schlauch. 😮

    Gruß:



  • Code zeigen. Benutzt du auch ExecSQL()?



  • Original erstellt von ratfury:
    Nur mit Update scheint das nicht zu funktionieren, weil mySQL dann keine neuen Datensätze erstellt.

    Das geht nur zweistufig. Ich hab bisher nur unter PHP mit mysql gearbeitet aber vom System her müsstest du dein Problem etwa so lösen können:

    Mach erst die Update-Query.
    Frag die Affected Rows (betroffene Zeilen) ab. Ist die Anzahl 0 führst du einen Insert aus. Andernfalls war der Update erfolgreich.

    -junix



  • *stimmt junix zu*



  • Den einzigste Code ist der mit Update:

    SQLQuery1->SQL->Clear() ;
    
    SQLQuery1->Active=false;
    
    SQLQuery1->SQL->Add("UPDATE search SET url = ' " + Label1->Caption  + " ' , title = ' " + Title + 
                        "' , description = ' " + MEdit1->Text + "', key = '" + MEdit2->Text  + 
                        "' ,color = '" + MEdit3->Text + "' ,from = '" + MEdit4->Text + "' ,copy = '" + 
                        MEdit5->Text + "', topic = '" + MEdit6->Text + "',content = '" + MEdit7->Text +   
                        " '  WHERE url = ' " + Label1->Caption + "' ");
    
    SQLQuery1->ExecSQL() ;
    

    Mehr hab ich noch nicht!

    [ Dieser Beitrag wurde am 09.07.2003 um 12:56 Uhr von Jansen editiert. ]



  • Wie krieg ich denn von einer SQL Abfrage einen Rückgabewert?



  • Hilfe von dem Anschauen ? -> SQLQuery1->ExecSQL()



  • super wenn ich das so mache:

    AnsiString zurueck = SQLQuery1->ExecSQL() ;
    

    dann bekomme ich entweder 0 oder 1 zurück! das bringt mir glaube ich nicht so viel.



  • Also ich hab das jetzt so gemacht wie junix das gesagt hat nur die Sache ist nun das die AffectedRows immer 0 sind, weiß auch nicht.

    Mein Code:

    SQLQuery1->SQL->Clear() ;
    SQLQuery1->Active=false;
    ClientDataSet1->Active=false;
    
    SQLQuery1->SQL->Clear() ;
    SQLQuery1->Active=false;
    SQLQuery1->SQL->Add("UPDATE search SET url = ' " + Label1->Caption  + " ' , title = ' " + Title + "' , description = ' " + MEdit1->Text + 
                        "', keywords = '" + MEdit2->Text  + "' ,author = '" + MEdit3->Text + "' ,publisher = '" + MEdit4->Text + 
                        "' ,copyright = '" + MEdit5->Text + "', pagetopic = '" + MEdit6->Text + "',contentlanguage = '" + MEdit7->Text +   
                        " '  WHERE url = ' " + Label1->Caption + "' ");
    
    SQLQuery1->ExecSQL() ;
    int rows = SQLQuery1->RowsAffected;
    
    if (rows == 0)
    {
    }
    else
    {
      SQLQuery1->SQL->Clear() ;
      SQLQuery1->Active=false;
      SQLQuery1->SQL->Add("insert into search (url,title,description,keywords,author,publisher,copyright,pagetopic,contentlanguage) values ('" + 
                          Label1->Caption + "', '" + Title + "', '" + MEdit1->Text + "', '" + MEdit2->Text + "', '" + MEdit3->Text + "', '" + 
                          MEdit4->Text + "', '" + MEdit5->Text + "', '" + MEdit6->Text+ "', '" + MEdit7->Text + "')");
    
      SQLQuery1->ExecSQL();
    }
    

    Ist da irgendwas drin falsch?

    Edit:
    Bitte auf sinnvolle Zeilenumbrüche achten. Danke!

    [ Dieser Beitrag wurde am 09.07.2003 um 13:18 Uhr von Jansen editiert. ]



  • BCC-Hilfe für TSQLQuery::ExecSQL

    Hinweis: Verwenden Sie ExecSQL nicht für Anweisungen, die Daten zurückgeben. Wenn eine Anweisung Daten zurückgibt, rufen Sie die Methode Open auf, oder setzen Sie die Eigenschaft Active auf true



  • oh man seid ihr so dumm oder tut ihr nur so ... also

    1. UpdateStatement in die SQL

    Hinweis aus der Hilfe : ExecSQL gibt die Anzahl der Datensätze zurück, auf die mit der letzten Anweisung zugegriffen wurde. Dieser Wert wird auch der Eigenschaft RowsAffected zugewiesen.

    2. If ( SQLQuery->ExecSQL() == 0 )
    Insert Statement

    is das nun so schwer gewesen.

    Hinweis: Verwenden Sie ExecSQL nicht für Anweisungen, die Daten zurückgeben. Wenn eine Anweisung Daten zurückgibt, rufen Sie die Methode Open auf, oder setzen Sie die Eigenschaft Active auf true

    jo das stimmt ja schon aber das gibt keine daten zurück sondern is nen Aktualisier Statement ...

    Daten zurückgeben tut z.B. select

    😡 😮 🙄



  • super, das hab ich nun auch gemacht aber ich bekomme als rückgabewert immer 0 zurück! irgendwie scheint der das update nicht zu machen.
    ich raffe nur nicht wieso.



  • set url where url <-- ist eigentlich das set url unnötig

    ... oO wenn du ne existierende url nimmst wirds wohl schon gehen .. 🙄

    [ Dieser Beitrag wurde am 09.07.2003 um 13:45 Uhr von 1ntrud0r editiert. ]



  • hmm, komisch ich kann auch keinen fehler in der syntax entdecken...



  • hey, es geht jetzt!!! ich weiss nur nicht wo dran es lag.

    danke an alle!


Anmelden zum Antworten