Operation muss eine aktualisierbare Abfrage verwenden ??????

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Black_Ice.

    Operation muss eine aktualisierbare Abfrage verwenden ??????

    Hallo, ich habe ein Problem mit meinem Datenbankprogrämmchen !

    Ich habe mir zum besseren Verständnis mal ein kleines Programm erstellt mit dem man auf eine Access DB zugreifen kann. Die dort vorhandenen Einträge kann man anzeigen, ändern, löschen, suchen und neue Einträge hinzufügen. Den Quellcode habe ich mir aus den Gallileo openBooks zusammengesucht.

    Bei mir installiert ist Office 2007 und Windows 7 Beta. Dort klappt auch alles problemlos !!

    Wenn ich das Programm aber auf einem XP Rechner laufen lasse kommt beim schreiben, ändern und löschen nur eine Msgbox in der "fehlt" steht.
    Das gleiche Spiel bei einem Vista Rechner, nur daß dort "Operation muss eine aktualisierbare Abfrage verwenden" in der Msgbox steht.
    Ich bin bei allen drei Rechnern als Admin angemeldet.

    Ich suche schon tagelang und finde nichts ?(

    Ich hoffe jemand kann mir helfen.

    Ich hab den Source und die DB mal angehängt. Beim ausführen muß die DB in C:\ liegen

    Grüße Black_Ice


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim con As New OleDb.OleDbConnection
    3. Dim cmd As New OleDb.OleDbCommand
    4. Dim reader As OleDb.OleDbDataReader
    5. Dim pnummer As New ArrayList
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. con.ConnectionString = _
    8. "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    9. "Data Source=C:\firma.mdb"
    10. cmd.Connection = con
    11. End Sub
    12. Private Sub cmdsehen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdsehen.Click
    13. AlleSehen()
    14. End Sub
    15. Sub AlleSehen()
    16. Try
    17. con.Open()
    18. cmd.CommandText = "select * from personen"
    19. Ausgabe()
    20. Catch ex As Exception
    21. MsgBox(ex.Message)
    22. End Try
    23. con.Close()
    24. txtNachname.Text = ""
    25. txtVorname.Text = ""
    26. txtPersonalnummer.Text = ""
    27. txtGehalt.Text = ""
    28. txtGeburtstag.Text = ""
    29. End Sub
    30. Sub Ausgabe()
    31. reader = cmd.ExecuteReader()
    32. lstTab.Items.Clear()
    33. pnummer.Clear()
    34. Do While reader.Read()
    35. lstTab.Items.Add(reader("nachname") & " # " _
    36. & reader("vorname") & " # " _
    37. & reader("personalnummer") & " # " _
    38. & reader("gehalt") & " # " _
    39. & reader("geburtsdatum"))
    40. pnummer.Add(reader("personalnummer"))
    41. Loop
    42. reader.Close()
    43. End Sub
    44. Private Sub cmdEinfügen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdEinfügen.Click
    45. Dim anzahl As Integer
    46. If txtPersonalnummer.Text = "" Then
    47. MsgBox("Bitte mindestens eine " _
    48. & "Personalnummer eintragen")
    49. Exit Sub
    50. End If
    51. Try
    52. con.Open()
    53. cmd.CommandText = _
    54. "insert into personen " & _
    55. "(nachname, vorname, personalnummer, " & _
    56. "gehalt, geburtsdatum) " & _
    57. "values ('" & _
    58. txtNachname.Text & "', '" & _
    59. txtVorname.Text & "', " & _
    60. txtPersonalnummer.Text & ", " & _
    61. Val(txtGehalt.Text) & ", '" & _
    62. CDate(txtGeburtstag.Text) & "')"
    63. 'MsgBox(cmd.CommandText)
    64. anzahl = cmd.ExecuteNonQuery()
    65. If anzahl > 0 Then
    66. MsgBox("Es wurde ein Datensatz eingefügt")
    67. End If
    68. Catch ex As Exception
    69. MsgBox(ex.Message)
    70. End Try
    71. con.Close()
    72. AlleSehen()
    73. End Sub
    74. Private Sub lstTab_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstTab.SelectedIndexChanged
    75. Try
    76. con.Open()
    77. cmd.CommandText = _
    78. "select * from personen " _
    79. & "where personalnummer = " _
    80. & pnummer(lstTab.SelectedIndex)
    81. reader = cmd.ExecuteReader()
    82. reader.Read()
    83. txtNachname.Text = reader("Nachname")
    84. txtVorname.Text = reader("vorname")
    85. txtPersonalnummer.Text = reader("personalnummer")
    86. txtGehalt.Text = reader("gehalt")
    87. txtGeburtstag.Text = reader("geburtsdatum")
    88. reader.Close()
    89. Catch ex As Exception
    90. MsgBox(ex.Message)
    91. End Try
    92. con.Close()
    93. End Sub
    94. Private Sub cmdÄndern_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdÄndern.Click
    95. Dim anzahl As Integer
    96. If txtPersonalnummer.Text = "" Then
    97. MsgBox("Bitte einen Datensatz auswählen " _
    98. & "und mindestens eine Personalnummer " _
    99. & "eintragen")
    100. Exit Sub
    101. End If
    102. Try
    103. con.Open()
    104. cmd.CommandText = _
    105. "update personen set " & _
    106. "Nachname = '" & txtNachname.Text & "', " & _
    107. "vorname = '" & txtVorname.Text & "', " & _
    108. "personalnummer = " _
    109. & txtPersonalnummer.Text & ", " & _
    110. "gehalt = " _
    111. & Val(txtGehalt.Text) & ", " & _
    112. "geburtsdatum = '" _
    113. & CDate(txtGeburtstag.Text) & "' " & _
    114. "where personalnummer = " _
    115. & pnummer(lstTab.SelectedIndex)
    116. 'MsgBox(cmd.CommandText)
    117. anzahl = cmd.ExecuteNonQuery()
    118. If anzahl > 0 Then
    119. MsgBox("Es wurde ein Datensatz geändert")
    120. End If
    121. Catch ex As Exception
    122. MsgBox(ex.Message)
    123. End Try
    124. con.Close()
    125. AlleSehen()
    126. End Sub
    127. Private Sub cmdLöschen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLöschen.Click
    128. Dim anzahl As Integer
    129. If txtPersonalnummer.Text = "" Then
    130. MsgBox("Bitte einen Datensatz auswählen")
    131. Exit Sub
    132. End If
    133. If MsgBox("Wollen Sie den ausgewählten " _
    134. & "Datensatz wirklich löschen?", _
    135. MsgBoxStyle.YesNo) = MsgBoxResult.No Then
    136. Exit Sub
    137. End If
    138. Try
    139. con.Open()
    140. cmd.CommandText = _
    141. "delete from personen " & _
    142. "where personalnummer = " & _
    143. pnummer(lstTab.SelectedIndex)
    144. 'MsgBox(cmd.CommandText)
    145. anzahl = cmd.ExecuteNonQuery()
    146. If anzahl > 0 Then
    147. MsgBox("Es wurde ein Datensatz gelöscht")
    148. End If
    149. Catch ex As Exception
    150. MsgBox(ex.Message)
    151. End Try
    152. con.Close()
    153. AlleSehen()
    154. End Sub
    155. Private Sub cmdSuchen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSuchen.Click
    156. If txtNachname.Text = "" Then
    157. MsgBox("Bitte einen Such-Namen eintragen")
    158. Exit Sub
    159. End If
    160. Try
    161. con.Open()
    162. cmd.CommandText = _
    163. "select * from personen where Nachname like '%" _
    164. & txtNachname.Text & "%'"
    165. 'MsgBox(cmd.CommandText)
    166. Ausgabe()
    167. Catch ex As Exception
    168. MsgBox(ex.Message)
    169. End Try
    170. con.Close()
    171. End Sub
    172. End Class
    Dateien
    • Black_Ice.rar

      (84,26 kB, 185 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Black_Ice“ ()

    Ich habe es unter Vista und XP getestet. Bei beiden funktioniert das hinzufügen, bearbeiten und löschen ohne Probleme.

    Nur so nebenbei, wieso nutzt du anstelle der ListBox keine ListView, das sieht besser aus mit der Trennung durch die SubItems als durch die # ...
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Nur so nebenbei, wieso nutzt du anstelle der ListBox keine ListView, das sieht besser aus mit der Trennung durch die SubItems als durch die # ...

    Wie gesagt, es soll ja nur zum verständnis dienen da ich noch totaler Anfänger bin.

    Allerdings verstehe ich nicht warum es bei dir läuft !?!? Welches Access hast du denn ? 2003 oder 2007 ? Kann es sein das mir irgendwelche Berechtigungen fehlen ? Und wenn ja wie stelle ich sie um ?

    Grüße Black_Ice
    Auf Vista habe ich Office 2007 auf XP garkein Office.
    Mich wundert nur, das die Nachricht einfach nur "fehlt" ist. Kann mir kaum vorstellen, das der Try Catch-Block bei einem Fehler nur "fehlt" ausgibt.
    Hast schon mal nach "Operation muss eine aktualisierbare Abfrage verwenden" gesucht?
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „T1g0r“ ()

    Hast schon mal nach "Operation muss eine aktualisierbare Abfrage verwenden" gesucht?

    Ja schon mehr als 2 Tage :thumbdown: kommt irgendwie nix bei rum !

    Auf jeden Fall weis ich jetzt schonmal das es nicht am Code liegt.

    Zumindest mal ein Anfang :D

    P.s. jetzt wo klar ist das es "eigentlich" funktioniert kann es gerne zu den Tutorials verschoben/hinzugefügt werden. Gibt ja noch mehrere die damit Probleme haben.

    Grüße Black_Ice
    Hast du mal Versucht, die Datenbank auf ein anderes Laufwerk als C:\ gelegt und getestet?
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Ja. Ich hab sie schon umbennant, neu angelegt, anderst strukturiert, Laufwerk gewechselt usw.

    Edit: Ich hab jetzt mal Office deinstalliert. Alles wie gehabt, ansehen und suchen funktioniert.

    einfügen, ändern, löschen --> "Operation muß eine aktualisierbare Abfrage verwenden" :cursing:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Black_Ice“ ()

    Es funktioniert !!

    Wenn ich die Datenbank auf einem USB stick ablege funktioniert alles wunderbar ! Aus irgendeinem unersichtlichen Grund fehlen mir anscheinend Schreibrechte ?!?

    Ich hab diese schon im Explorer in den Eigenschaften geändert. Allerdings tritt keine Besserung ein.

    Jemand vieleicht noch ne Idee ?
    Ich nutze für meine Datenbanken immer Anwendungsdaten-Ordner von Windows

    VB.NET-Quellcode

    1. Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

    Da erstelle ich einen Ordner mit dem Namen meiner Anwendung

    VB.NET-Quellcode

    1. Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\" & Application.ProductName


    Der Pfad ist unter Vista: (Versteckt)
    "System-Partiton:\Users\USER\AppData\Roaming"
    Unter XP: (Versteckt)
    "System-Partiton:\Dokumente und Einstellungen\USER\Anwendungsdaten"

    Dort solltest du eigentlich immer Schreibrechte haben, da der Ordner für solche Daten gedacht ist.
    Wie hattest du es denn bis jetzt vor die Datenbankdatei mitzuliefern? Beim Programmstart zu erzeugen, in einem Zip-Verzeichnis, einem Setup?
    Beim erzeugen (beim Setup kommt es auch darauf an welches du hast) kannst du die Datenbankdatei in dem oben genannten Pfad erzeugen bzw kopieren lassen. Beim Entpacken wird das etwas umständlich, da du dem User das ganze erklären musst. Auserdem ist es ziemlich unprofessionel den User Daten von Hand irgendwohin kopieren zu lassen...
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia