Entwickler-Ecke
Datenbanken - "Tabelle ist schreibgeschützt"
Siggi - Do 03.10.02 15:12
Titel: "Tabelle ist schreibgeschützt"
Hallo!
Beim Löschen eines Datensatzes kommt bei mir im Programm immer die Fehlermeldung "Tabelle ist schreibgeschützt". Das wundert mich allerdings, weil ich in der Datenbankoberfläche die Datensätze beliebieg löschen kann. Mit der referentiellen Integrität sollte es an sich auch nichts zu tun haben.
Ja, vielleicht hatte einer von Euch schonmal den gleichen Fehler und kann mir helfen?
Danke
Mfg
Siggi
MrSpock - Do 03.10.02 16:18
Hallo Siggi,
welche Datenbank benutzt du, welches Betriebssytem und hast du für die DB eventuell ein oder mehrere Passwörter angelegt?
Siggi - Fr 04.10.02 12:58
janz normaal Paradox 7, ohne Passwörter
MrSpock - Fr 04.10.02 14:38
Hallo Siggi,
die Frage zum Betriebssystem hast du zwar noch nicht beantwortet, aber ich nehme an, dass es nicht daran liegt, dass du eventuell Win 2000 hast und keinen Zugriff auf das Verzeichnis hast!?
Es sieht so aus, als wäre die Datei bereits geöffnet, möglicherweise exklusiv. Starte das Programm doch mal ohne die IDE.
Siggi - So 06.10.02 22:34
...Win98SE, und ich habe vollen Zugriff, nur über das Delphi-Programm nicht.
Wenn ich eine Test-Anwendung bau', in der ich einfach nur einen Datensatz der besagten Tabelle lösche, klappt es auch. Nur bei dem "HauptProgramm" funktioniert es nicht...
trotzdem danke!
MrSpock - Mo 07.10.02 06:55
Hallo Siggi,
das ist schon mal eine wichtige Auskunft. Es muss dann wohl an dem Hauptprogramm liegen.
Kannst du mal den Teil posten, der für das Löschen zuständig ist. Und hast du das Programm auch einmal ohne IDE getestet?
LCS - Mo 07.10.02 07:13
Hi Siggi
verwendest du zum Zugriff tatsächlich eine Tabelle? Ist vielleicht versehentlich die Eigenschaft ReadOnly auf True gesetzt? Oder verwendest du eine TQuery. Dann darfst du keine Verbindungen zu anderen Tabellen oder Sortierfolgen drin haben.
Gruss Lothar
Siggi - Di 08.10.02 21:33
Hallo!
Erstmal vielen Dank!
Das "Problem" ist gelöst :o . Ich habe nicht gewusst, dass man bei einer Sortierung mit TQuery die Datensätze nicht löschen kann *duck*.
Nun ja, tschuldigung, dass ich mich nicht gleich von Anfang an klar ausgedrückt habe.
Mfg
Siggi
oPPi - So 13.10.02 14:10
Hy,
dazu hab ich auch mal ne Frage. Und zwar kommt bei mir die selbe Meldung. Ich verwende ebenfalls ne Paradox-DB. Ferner hab ich ein
DBGrid mit ner Sortierreinenfolge (Query). Jetzt zu meinen Prob.
ich möchte aus dem DBGrid welches mir Datensätze anzeigt die ich mit ner SQL-Abfrage gefiltert habe, einen oder mehrere Datensätze die ich
im DBGrid markiere löschen. Leider weiß ich nicht wie.
Hab es schon mit Delete from ... Where Dateiname = xxx
o. DBGrid.SelectedRows.Delete probiert aber irgendwie bin ich
zu blöd das Problem zu lösen.
Gruß
oPPi
MrSpock - So 13.10.02 15:27
Hallo oPPi,
du musst die Eigenschaft RequestLive auf True setzen, nur dann kannst du einen Datensatz mit
löschen. Aber nicht jede Datenmenge erfüllt die Bedingung, dass sie geändert werden kann. Z.B. wenn deine Datenmege eine Aggregatfunktion nutzt ist sie nicht mehr aktualisierbar.
Durch RequestLive erhälst du nicht nur eine Kopie der SELECTierten Daten, sondern ein Löschvorgang wird auf die zugrundeliegende Tabelle angewendet. Also VORSICHT, IS COOL MAN :mrgreen:
oPPi - So 13.10.02 20:05
Hallo,
habe RequestLive = True gesetzt. Weiß aber nicht wie du das meinst mit:
Also ich hab ne Abfrage erstellt die mir im DBGrid bestimmte Datensätze anzeigt.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.ComboBox1Select(Sender: TObject); begin if query1.Active then query1.close; query1.sql.Clear; query1.SQL.add('SELECT Thema.Thema, Tipps.Thema, Tipps.Dateiname, Tipps.Inhalt, Tipps.Datum FROM Thema'); query1.SQL.Add('INNER JOIN Tipps ON (Tipps.Thema = Thema.Thema)'); query1.SQL.add('WHERE Tipps.Thema='+ quotedstr((sender as TComboBox).Items[ComboBox1.ItemIndex])); query1.Open; end; |
Es wird in meinem DBGrid die Spalte Dateiname angezeigt, jetzt möchte ich einen markierten Datensatz löschen, dazu hab ich ne Abfrage erstellt die aber leider nicht funktionert.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.btn_DeleteClick(Sender: TObject); begin if query1.Active then query1.close; query1.sql.Clear; Query1.SQL.Add('DELETE Tipps.Dateiname FROM Tipps'); Query1.SQL.Add('WHERE Tipps.Dateiname='+ quotedstr((sender as TDBGrid).SelectedField.AsString)); Query1.Open; end; |
DBGrid1.SelectedRows.Delete funktioniert ja auch nicht.
Irgendwas mach ich falsch, SQL ist auch nicht so meine Stärke. Is vielleicht auch nur ne Kleinigkeit.
Gruß
oPPi
MrSpock - Mo 14.10.02 07:23
Hallo oPPi,
ein SQL Delete Statement kann nicht mit Open ausgeführt werden, sondern nur mit ExecSQL. :roll:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.btn_DeleteClick(Sender: TObject); begin if query1.Active then query1.close; query1.sql.Clear; Query1.SQL.Add('DELETE Tipps.Dateiname FROM Tipps'); Query1.SQL.Add('WHERE Tipps.Dateiname='+ quotedstr((sender as TDBGrid).SelectedField.AsString)); Query1.ExecSQL; end; |
oPPi - Mo 14.10.02 20:57
Hallo,
danke dir erstmal. Ich hab mir die Hilfe noch mal zu Rate gezogen u. da
hab ich das dann auch gefunden das ich Query1.ExecSQL verwenden muß. Leider hab ich nun ein weiteres Problem das er mir die Meldung schmeißt: Ungültige Typumwandlung -> Eine Exception ist bei der Klasse
EInvalidCast aufgetreten.
Der Fehler tritt auf bei:
Quelltext
1:
| Query1.SQL.Add('WHERE Tipps.Dateiname='+ quotedstr((sender as TDBGrid).SelectedField.AsString)); |
Ich weiß jetzt nicht was man bei (sender as TDBGrid).xxx einsetzten könnte damit er eine selektierte Zeile oder ein Feld löscht. Es hängt jetzt nur noch an dieser Kleinigkeit das mein Programm endlich fehlerfrei läuft.
Wäre dir sehr verbunden wenn du mir da ebenfalls weiterhelfen könntest.
Gruß
oPPi
LCS - Di 15.10.02 06:28
Hi
Wenn du bei deinem Datengitter die Eigenschaft RowSelect gesetzt hast, wird es generell nicht funktionieren, da SelectedField dann immer
nil ist.
Aber auch sonst würde ich SelectedField nicht verwenden, denn was passiert wenn der Anwender mal nicht auf die Spalte mit dem Dateinamen klickt? :roll:
Am besten wärs wenn du direkt das Feld mit dem Dateinamen aus dem Datengitter übernimmst mit:
Quelltext
1:
| (Sender as TDBGrid).FieldByName('Dateinamenfeld').AsString |
oder
Quelltext
1:
| (Sender as TDBGrid).Fields[Feldnummer].AsString |
Gruss Lothar
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!