Keine update-Tabelle über CurrentDb.Ausführen
Ok, bevor jemand sagt mir, dass es ein Duplikat von eine andere Frage, ich glaube nicht, dass es die gleiche Sache. Ich bin mit einem CurrentDb.Execute
in VBA in MS Access 2007 und es ist, nachdem ich die option dbFailOnError
, erhielt ich diese Fehlermeldung:
Fehler 3218 Konnte nicht aktualisieren; momentane Sperrung
Vorher nichts unternommen wurde, auf den Tisch, ich bin versucht, zu aktualisieren. Hier der aktuelle code im Modul Formulars:
Option Compare Database
Private Sub cmdvalidate_Click()
Dim user As String
Dim rs As Recordset
Dim strsql As String
Dim pass As String
Dim f1 As Form_frmMenu
strsql = "SELECT * FROM account WHERE username = '" & Me.txtusername & "'"
'Execute SQL and store in recordset (cannot be stored in a string or integer)
Set rs = CurrentDb.OpenRecordset(strsql)
'Go through recordset and extract first value
If rs.RecordCount > 0 Then
rs.MoveFirst
rs.Edit
pass = rs!Password
' I know it's not the best way to validate password here (since it is
' case insensitive, but it's only for internal use with 3 people in
' the same department. This will considered if there are more people
' who get involved, but for the time being, this is not important.
If pass = Me.txtpassword Then
user = rs!UserName
' MS Access debugger says the error is here
CurrentDb.Execute "UPDATE [Account] SET [Account].[Active] = 'Y' WHERE [Account].[Username] = '" & user & "'", dbFailOnError
MsgBox "Login Successful!"
'DoCmd.OpenForm "frmMenu", , , , , acDialog
Else
MsgBox "Incorrect Username Or Password. Please try again."
End If
Else
MsgBox "Something has gone wrong. Please contact your administrator."
End If
End Sub
Mein Ziel am Ende des Tages ist es, in der Lage sein, den Benutzernamen, wer sich angemeldet hat. Zuerst habe ich versucht eine Globale variable verwenden, aber es scheint, dass dies nicht möglich ist mit verschiedenen form-Module. Anstatt also, ich habe die Active
Feld, so dass ich konnte den Benutzernamen in einer anderen form-Module über eine SELECT
- Anweisung.
Einige Prüfungen, die ich gemacht habe:
- Die Datei wird nicht geöffnet von niemandem außer mir, ich bin mir 100% sicher.
- Die Abfrage war zunächst etwas unter, aber ich habe den eckigen Klammern nur für den Fall gab es reservierte Wörter:
"UPDATE Konto SET Active = 'Y' WHERE Benutzername = '" & user & "'"
- Anderen form-Module in der gleichen Datei nicht über dieses UPDATE-Problem und es gibt keine anderen Optionen außer
Option Compare Database
(die anderen Sachen sindPrivate Sub
s). - Ich entdeckt, dass ich verwenden könnte
Environ("Username")
zu Holen Sie sich die Windows-Anmelde-Benutzernamen in den anderen Modulen statt. Dies wird das problem lösen, aber ich bin immer noch Fragen, warum diese Abfrage kann nicht ausgeführt das update.
Fragen:
- Wenn die Tabelle gesperrt ist, gibt es eine Möglichkeit, kann ich es entsperren?
- Warum ist diese Abfrage immer einen Fehler in den ersten Platz? Was gesperrt hat?
Weiß ich nicht viel, wenn überhaupt über vb und ich bin mir auch nicht sicher, wie ich auf dieses Projekt...
InformationsquelleAutor Jerry | 2013-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
1.) , Wenn die Tabelle gesperrt ist, gibt es eine Möglichkeit, kann ich es entsperren?
Bin ich mir nicht so sicher, dass die gesamte Tabelle gesperrt ist. Vielleicht nur die aktuellen recordset-Zeile ist gesperrt. Siehe #2.
2.) Warum ist diese Abfrage immer einen Fehler in den ersten Platz? Was gesperrt hat?
Den code nicht
rs.Edit
. Später, beim Versuch zuUPDATE
die Tabelle direkt der betreffenden Zeile ist die gleiche Zeile, die ist zur Zeit gesperrt, in der Datensatzgruppe. Es gibt jedoch eine Menge mehr code, das macht es schwer zu fassen die Aussagen dazu beitragen, die Fehler.Diese vereinfachte code-Beispiel sollte verdeutlichen, was Los ist.
Geschrieben, dass code-Trigger-Fehler 3218, "Konnte nicht aktualisieren; momentane Sperrung", auf meinem system.
Diese änderung deaktiviert die
Edit
- Anweisung und ermöglicht dasUPDATE
erfolgreich ausgeführt werden kann.Eine Möglichkeit gefunden, den Fehler zu vermeiden, wurde durch hinzufügen von
rs.Close
vor der Ausführung derUPDATE
. Das funktionierte, weil das schließen des Recordsets veröffentlicht, Bearbeiten, sperren; wenn Sie tatsächlich geänderten Werte in die Zeile, die Sie gebraucht hätters.Update
zu retten, bevorrs.Close
.Jedoch in der original - version, Sie wurden nur Lesen Werte aus dem recordset nicht ändern, einer von Ihnen. So
rs.Edit
war nicht erforderlich.rs.Edit
würde die Tabelle sperren. Eine Sache aber habe ich versucht zu ändern, das update auf eine andere Zeile und dies nicht mit dem original-code), die mir sagt, dass die ganze Tabelle gesperrt ist, im Gegensatz zu gewissen Zeilen? Auch dachte ich, dass der Kommentar in den code zeigte, wo der code, die den Fehler gab (die plötzliche Veränderung in der Einzug war das auch gemeint, um Aufmerksamkeit) 🙁 Und die code-format verhindert, dass die Verwendung von Fett und/oder Unterstrichen, damit es nicht so einfach zu tun. Haben Sie irgendwelche Ratschläge auf diesen Aspekt?In meinem test
Edit
auch gesperrt wird die gesamte Tabelle, nicht nur die aktuelle recordset-Zeile. Jedoch, als ein time-saver für mich, ich sagte "vielleicht" ... verlassen öffnen die Möglichkeit für Datenbank-und/oder recordset-lock Optionen werden könnte, wird differenzierter.Nicht sicher, wie gut verstehe ich den rest Ihres Kommentars. Ich habe versucht, Ihnen zu zeigen, von unschätzbarem Wert "trouble-shooting" Grundsätze ---> vereinfachen und zu konzentrieren, Sie arbeiten zusammen. Zum Beispiel, warum hast du uns zeigen
Private Sub cmdClose_Click()
? Trägt es zu dem problem? Im Grunde genommen, eine Kopie der problem-code, verwerfen Sie alles, was irrelevant ist und konzentrieren Sie Ihre Aufmerksamkeit (und unsere!) auf, dass die einfache version.Okay, fair genug, auf der vielleicht, ich war mehr konzentrieren Sie sich auf Ihren zweiten Punkt, das zweite mal, dass ich deine Frage Lesen! ^^; Ich denke, Sie haben verstanden, den zweiten Teil von meinem Kommentar gut! Ich sehe deinen Punkt jetzt und beseitigt einige bits. Die Sache, obwohl, ist, dass manchmal Fehler können durch etwas verursacht werden, ziemlich fern von der Leitung den Fehler verursacht. Ich wollte nicht ausschließen, die Möglichkeit. Ich weiß wirklich nicht, warum die person vor mir verwendet es und ich dachte, es hatte einige andere wichtige Zwecke, oh gut. Danke nochmal 🙂
InformationsquelleAutor HansUp
Huh, ich glaube, ich habe gerade gefunden, was den Fehler verursacht.
Offenbar, wenn Sie ein RecordSet ist mit Hilfe einer Tabelle (hier die Zeile
Set rs = CurrentDb.OpenRecordset(strsql)
), die Tabelle kann nur zugegriffen werden, durch das RecordSet und nicht durchCurrentDb.Execute
mehr (zumindest aktualisieren).Zwei workarounds fand ich für meine konkrete situation:
Ersetzen Sie die
CurrentDb.Execute
durch etwas zu aktualisieren, das RecordSet selbst (Wahrscheinlich einfacher):Schließen Sie das RecordSet zuerst, dann verwenden Sie
CurrentDb.Execute
:InformationsquelleAutor Jerry