Announcement

Collapse
No announcement yet.

Zeile per SQL updaten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeile per SQL updaten

    Ich habe eine Zeile einer Accesstabelle in einem DataSet gespeichert. Nun will ich genau diese Zeile updaten.
    Ich hole die Zeile mit "Select Top 1 * from Tabelle" mit zwei Einschränkungen.
    Eine der beiden Einschränkungen (zwei Felder sollen null sein) soll nun verändert werden.
    Leider klappt so was wie "Update Tabelle Set Spalte = "test" WHERE Name = (Select Top 1 *....);" natürlich nicht (wäre auch zu schön gewesen...).
    Hat da jemand einen anderen Vorschlag, wie man das machen kann?
    Ich hab auch schon versucht das DataSet in den Update-Befehl einzubeziehen, geht aber leider nicht.

  • #2
    Hallo,

    du brauchst doch den passenden Wert in der WHERE-Klausel. Woher kommt er? Beispielsweise aus DataSet.Tables["Tabelle"].Rows[0]["Name"] mit Cast nach String, nämlich mit dem Namen der Tabelle (oder Index 0 oder was auch immer) und dem Namen der Spalte.

    Dann kannst du einen DbCommand erstellen und mit ExecuteNonQuery ausführen.

    Übrigens solltest du einen SQL-Command niemals per String-Verknüpfung erstellen, sondern immer per Parameter. Siehe z.B. [Artikelserie] Parameter von SQL Befehlen.

    Gruß Jürgen

    Comment


    • #3
      Also das mit dem Row in String speichern hab ich inzwischen auch.
      Es wäre aber besser die ID (AutoWert) abzugleichen und nicht den Namen. Weißt du welcher Datentyp in .net dafür geeignet ist?

      String geht natürlich nicht. Bei Integer und Long krieg ich die Fehlermeldung "Ungültige Konvertierung von der Zeichenfolge SET Bearbeitung = 'Ja' WHERE Adr in Typ Double" (eigentlich heißt das letzte Adresse_ID, aber die Meldung schneidet da immer was weg).
      Ich hab jedoch gelesen Integer entspreche dem Access AutoWert...

      Comment


      • #4
        Das ist korrekt, AutoInc wird durch einen INTEGEr realisiert. Wenn das Feld wirklich so heißt, dann geht es analog:
        Code:
        int myValue = (int)myDataSet.Tables["Tabelle"].Rows[0]["Adresse_ID"];
        Dann darfst du keinesfalls diesen Wert direkt in einen String einbauen (das bringt nämlich den DbProvider wegen der Mischung von String und Integer durcheinander), sondern musst unbedingt Parameter verwenden.

        Vielleicht heißt das Feld aber etwas anders, z.B. mit Leerzeichen? Dann muss der richtige Feldname in [] eingebunden werden.

        Die Fehlermeldung sieht aber so aus, als ob der SQL-Befehl noch nicht sauber aufgeschrieben ist. Kontrolliere ihn einmal exakt per Debugger; zur Struktur eines Update-Befehls siehe z.B. wikibooks: Einführung in SQL.

        Jürgen

        Comment


        • #5
          Der Update-Befehl geht, den habe ich in einer Datenbank getestet und als ich noch nach dem Namen prüfte hat das Ganze auch so geklappt, wie es sollte.

          Ich habe nun bei der Wertzuweisung meiner Integervariable ein Convert.toInt...(...) gemacht, aber es geht dennoch nicht (ich habe UInt/ Int16, 32 und 64 und die ausprobiert).
          Fehlermeldung: Datentypen in Kriterienausdruck unverträglich. (Wer hätte es gedacht? )
          Noch eine Idee, was gehen könnte?

          Die andere Fehlermeldung kam übrigens, weil ich vergessen hatte das toString wegzumachen

          Comment


          • #6
            Originally posted by Imari View Post
            Fehlermeldung: Datentypen in Kriterienausdruck unverträglich. (Wer hätte es gedacht? )
            Jetzt ist es endgültig soweit: Ohne genaue Zitate von SQL-Befehl und Code, wie er eingebunden ist und wie die ID-Variable dort "hineingelangt", wäre jede weitere Antwort nur wüstes Herumraten ins Blaue hinein.

            Kannst du dir nicht vorstellen, dass solche Informationen hilfreich und ggf. nötig sind?

            Jürgen

            Comment


            • #7
              Originally posted by Jürgen Thomas View Post
              Kannst du dir nicht vorstellen, dass solche Informationen hilfreich und ggf. nötig sind?
              Sry, hab ich ganz vergessen gehabt. Hier ist der Code:
              [highlight=vbnet]
              Dim dt As DataTable = New DataTable(sTableName)
              Dim da As OleDbDataAdapter
              da = New OleDbDataAdapter("SELECT TOP 1 * FROM " & sTableName & " WHERE Val is null and Bearb is null;", conn)
              da.Fill(ds)

              Dim testid As Integer
              testid = Convert.ToInt32(ds.Tables(0).Rows(0).Item(0))

              Dim cmdupdate As OleDbCommand = New OleDbCommand("UPDATE " & sTableName & " SET Bearb = 'ja' WHERE Adresse_ID = '" & testid & "';", conn)
              cmdupdate.ExecuteNonQuery()

              [/highlight]

              Ich habe auch versucht, das ganze erst in einen String zu speichern und anschließend umzuwandeln, was natürlich nicht geht. Aber in diesem String stand das drinn, was drinstehen sollte. Nur in den Integer krieg ichs nicht rein.

              Comment


              • #8
                Genau das hatte ich erwartet bzw. befürchtet; deshalb wollte ich deinen ganz konkreten Code sehen. Du setzt die ID, also eine Zahl, in Hochkommata; das teilt aber der Datenbank mit, dass es sich um einen String handelt. Und schon geht es durcheinander.

                Das ist endgültig der Beweis, dass Parameter die richtige Lösung bringen. (Es geht zwar auch anders, aber alles andere ist mehr oder weniger Schrott.)

                Ich nehme jetzt mal an, dass unter Item(0) wirklich die ID steht. (Kann man unter VB nicht auch Item("Adresse_ID") abfragen?) Dann geht es dahinter etwa so weiter (ich arbeite mit C#, also sind Fehler möglich):
                [highlight=vbnet]Dim cmdupdate As OleDbCommand = New OleDbCommand("UPDATE " & sTableName & _
                " SET Bearb = ? WHERE Adresse_ID = ?;", conn)
                cmdupdate.Parameters.AddWithValue("@Bearb", "ja")
                cmdupdate.Parameters.AddWithValue("@Adresse_ID", testid)
                cmdupdate.ExecuteNonQuery()[/highlight]
                Die richtige Zuordnung macht dann der DbProvider, du musst bei Oledb vor allem auf die richtige Reihenfolge achten.

                Gruß Jürgen

                PS. In dieser Situation ist Convert.To akzeptabel. Unter C# geht es noch schneller mit (int); gibt es nicht auch bei VB eine ähnliche Schreibweise? In allen anderen Fällen solltest du auf Convert verzichten und besser Int32.TryParse usw. verwenden.

                Comment


                • #9
                  Die Hochkommata... das ärgert mich jetzt...
                  Adresse_Id anzugeben ist net so das Wahre, da ich später sowieso beliebige Datenbanken benutzen will (und im Normalfall ist der erste Eintrag ja eigentlich eine ID...). Momentan sind sTableName usw. noch festgesetzt, das werd ich aber noch ändern.

                  Vielen, vielen Dank.
                  Ich dachte mir schon, dass die Lösung trivial sein würde, aber darauf bin ich leider nicht gekommen.

                  Comment

                  Working...
                  X