| 

.NET C# Java Javascript Exception

4
Hallo
ich bin mir einer OLEDB-Connection auf eine Access-DB. Folgendes Problem gibts beim Löschen von Tabellen.
SQL = "DELETE FROM tbReports_Gruppen"
Dim CMD As New System.Data.OleDb.OleDbCommand(SQL,MyConnection)
Dim Anz% = CMD.ExecuteNonQuery
hier kommt Fehler: Datensatz ist gelöscht.

Folgender sql geht aber:
SQL = "DELETE FROM tbReports_Gruppen" WHERE id_RG={" & Guid.Empty.ToString & "}"

Warum geht das ohne WHERE nicht?

Vielen Dank
22.02.2012
torsten45 31 1 3
3 Antworten
1
Klingt für mich bisher so, als sei / werde ein Datensatz (oder mehrere) in tbReports_Gruppen bereits oder gerade gelöscht, so dass das neue SQL Statement auf diese(n) Datensatz/-sätze, zufällig auch eine Löschanweisung, nun fehlschlägt.

Ich kenne das in bestimmten Konfigurationen mit SQL Server als Backend und Access als Frontend. Ich hatte immer Access in Verdacht, Änderungen am SQL Server zu langsam mitzubekommen. Oder, weniger wahrscheinlich, aber auch denkbar, der SQL Server ist so konfiguriert, dass er zeitweise mit unsinnig großen Logfiles o.ä. komplett ausgelastet ist und Transaktionen nur langsam abschließt oder die nach Abschluss geänderten Tabellendaten nur langsam an die Clients ausliefert. Mit einer geschickt gewählten Kombination der Settings AutoGrowth und AutoShrink kannst du es hinkriegen, dass der SQL Server gar nicht mehr mit dir spricht. Bei Access als Datengrab, äh, -quelle, kommt zu solchen möglicherweise selbst reproduzierten "Features" noch Access' grundsätzliche Anfälligkeit dazu.

Wenn du die Chance hast, in deiner Sprache (keine Info darüber, ist das VB.net? Die Dim's sehen nach einem VB-Dialekt aus) einen refresh der connection zu erzwingen, solltest du's damit probieren. Vielleicht auch die Verbindung kappen und neu aufbauen.

Dein ähnlich lautender Bericht für mein bekanntes und als ungelöst im Hinterstübchen schlummerndes Problem bringt mich ins Nachdenken, ob es nicht vielleicht falsch ist, bei der Fehlersuche auf Backend oder Frontend zu fokussieren. Wenn es sich doch offensichtlich um ein Kommunikationsproblem handelt, müsste man auch mal die Kommunikationsschicht betrachten, also den ODBC-/OLE-DB-Provider. Vielleicht lässt sich dein OLE-DB-Treiber direkt ansprechen und zum Refresh zwingen? Wenn du die Chance hast, versuch es doch mal mit einem alternativen Treiber. Benötigst du OLE-DB-Funktionalität? Oder ginge auch ein schlichterer ODBC-Provider?

Sorry, dass ich keine fertige Lösung bieten kann, aber das liegt in der Natur des Problems und an der knappen Wiedergabe der Fehlermeldung. Zusätzlich zur Nachfrage von Christoph_Wi würde mich noch interessieren, wer denn den Fehler meldet, Backend, Frontend, OLE-DB-Provider, System?
22.02.2012
mupan 575 1 8
mupan 575 1 8
1
Vielen Dank für die Hilfe - ich habe mein Problem jetzt doch noch gefunden.
Um eine Tree-Ansicht zu erhalten habe ich in meiner Tabelle 'tbReports_Gruppen' ein id_RP_Parent, welches eine Beziehung mit Löschweitergabe zu id_RP hat.
Dadurch sind auf Grund der Beziehung schon Rows gelöscht, bevor diese vom Delete her erreicht werden.
Mit der Löschbingung: where (id_RP_Parent is null) funzt es auch.

sorry
23.02.2012
torsten45 31 1 3
Kein Grund, sich zu entschuldigen. Ich hab viel gelernt allein aus der Frage und deiner Lösung.
mupan 23.02.2012
So ist es also doch ein Problem des Datenmodells, und keines der Netzwerkkommunikation.
mupan 23.02.2012
0
Was kommt da denn für ein Fehler, also wie ist die genaue Meldung?
22.02.2012
Christoph_Wi 83 1 5

Stelle deine Sql-Frage jetzt!