Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Schreibkonflikt in Access; am SQL Server direkt ist die Änderung möglich

930 views
Skip to first unread message

Herbert Gottlieb

unread,
Feb 17, 2009, 3:38:23 AM2/17/09
to
Hallo,

ich habe hier ein Schreibkonfliktproblem (ACC2003, SQLServer 2000):

Ich hatte über die AccessDb 2 Datensätz in eine Tabelle (zum SQL Server
verlinkt) eingefügt.
Nun ergibt sich folgendes Problem:
Über Access (Tabelle öffnen und direkt ändern) ist es nicht möglich
Änderungen an diesen zwei Zeilen vorzunehmen (mit dem Enterprisemanger am
SQL-Server ist dies kein Problem), ich bekomme immer die Meldung

Schreibkonflikt
Dieser Datensatz wurde seit Beginn der Bearbeitung von einem anderen
Benutzer geändert. Wenn sie .....


Ich habe bereits die Datenbank geschlossen und geöffnet keine Änderung. Auch
im Enterprisemanager sind auf diese Tabelle keine Sperren auf diese Tabelle
ersichtlich. Es greift niemand außer mir auf die Tabellen zu.

Kann das am Access oder Einstellungen liegen oder was könnte ich tun?
Danke für eure Hilfe

Herbert


Stefan Hoffmann

unread,
Feb 17, 2009, 4:07:33 AM2/17/09
to
hallo Herbert,

Herbert Gottlieb schrieb:


> Kann das am Access oder Einstellungen liegen oder was könnte ich tun?

Du hast entweder keinen Primärschlüssel oder aber Felder mit unpräzisem
Datentyp (float, real) in deiner Tabelle.

Hier brauchst du zwangsweise noch ein Feld vom Type TIMESTAMP. Diese
Feld solltest allerdings in jeder Tabelle haben, welche du in Access nutzt.

mfG
--> stefan <--

Herbert Gottlieb

unread,
Feb 17, 2009, 8:21:53 AM2/17/09
to
Hallo Stefan,

danke, nach hinzufügen vom timestamp und Neueinbinden hat es funktioniert.

Frage: soll ich das auch in den Views und Abfragen an Access weitergeben?

LG Herbert


"Stefan Hoffmann" <ste...@ste5an.de> schrieb im Newsbeitrag
news:%23Lsds8N...@TK2MSFTNGP04.phx.gbl...

Stefan Hoffmann

unread,
Feb 17, 2009, 9:00:45 AM2/17/09
to
hallo Herbert,

Herbert Gottlieb schrieb:


> Frage: soll ich das auch in den Views und Abfragen an Access weitergeben?

In Access-seitigen Abfragen benötigst du sie nicht.

Bei verknüpften Sichten brauchst du es nur, wenn du selbig ändern
möchtest. Es reicht dann die TIMESTAMP-Spalte der Basistabelle.


mfG
--> stefan <--

Herbert Gottlieb

unread,
Feb 17, 2009, 12:04:28 PM2/17/09
to
Danke Stefan

LG Herbert
"Stefan Hoffmann" <ste...@ste5an.de> schrieb im Newsbeitrag

news:uKBuhgQk...@TK2MSFTNGP03.phx.gbl...

Henry Habermacher

unread,
Feb 17, 2009, 11:43:40 PM2/17/09
to
Hallo Herbert

Herbert Gottlieb wrote:
> danke, nach hinzufügen vom timestamp und Neueinbinden hat es funktioniert.

Achtung aufgepasst: Wenn diese Meldung kommt, dann hast Du wirklich einen
Datentyp verwendet, der nicht 100% kompatibel ist. Da heisst es aufpassen,
da sonst bei Updates Rundungsfehler entstehen können, die Du jetzt nicht
mehr siehst. Häufiger Auslöser für solche Fehler sind der SmallDateTime
Datentyp des SQL Servers. Verwende statt dessen den ganzen DateTime
Datentyp, dann tritt der Fehler nicht auf.

> Frage: soll ich das auch in den Views und Abfragen an Access weitergeben?

Das einfachste ist, es überall reinzumachen. Wirklich brauchen tutst Du es
da, wo Du updates machen willst. Bei Nur-Lese Abfragen oder nicht
veränderbaren Views macht es also keinen Sinn.

Zum genaueren Veständnis des Fehlers
Wenn Access einen Update zum SQL Server macht, muss es feststellen, ob der
Datensatz inzwischen geändert wurde. Dazu kontrolliert Acces zuerst, ob es
einen Timestamp Datentypen gibt. Dieser ändert den Wert bei jedem Update.
Ist der Wert noch gleich, dann wurde der Datensatz zwischentzeilich noch
nicht geändert. Die Where Bedingung wäre dann
WHERE DeineID = @ID
AND DeinTimeStamp = @DeinTimeStamp.Oldvalue

Die letzte Zeile macht Access selber rein. Falls ein Timestamp Feld fehlt,
dann macht Access das mit einem Vergleich des Inhalts aller Felder des
DAtensatzes. Dies führt zu ewiglangen Update Statements, weil da alle Felder
übergeben werden müssen. Das würde dann so aussehen:

WHERE DeineID = @ID
AND DeinFeld1 = @DeinFeld1.OldValue
AND DeinFeld2 = @DeinFeld2.OldValue
..
AND DeinFeldn = @DeinFeldn.OldValue

Wenn nun der Update zurückmeldet RecordsAffected = 0 dann geht Access davon
aus, dass der Datensatz eben zwischenzeitlich geändert wurde.

Wenn nun Access ein Feld eines ungenauen Datentypen eingelesen und in sein
internes Format umgewandelt hat, dann steht da wegen der Ungenauigkeit nicht
das gleiche drin, wie im SQL Server vorher eingelesen wurde. Die
WHERE-Bedingung wird nun also verhindern, dass der Datensatz gefunden wird
(obwohl die ID ja identisch ist, aber eben die Inhalte der Felder nicht mit
dem umgewandelten Wert übereinstimmen) und Du bekommst die gesehene Meldung.

Gruss
Henry


--
Zu spät zur NEK1 angemeldet? Kein Problem. Details in FAQ
Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com

Siegfried Schmidt

unread,
Feb 18, 2009, 2:25:13 AM2/18/09
to
Hallo Henry,

> Die letzte Zeile macht Access selber rein. Falls ein Timestamp Feld
> fehlt, dann macht Access das mit einem Vergleich des Inhalts aller
> Felder des DAtensatzes.

Nicht des Datensatzes, sondern nur die Felder des aktuellen Recordsets.


Siegfried
--
http://www.schmidt.ath.cx

Henry Habermacher

unread,
Feb 19, 2009, 9:38:02 PM2/19/09
to
Hallo Siegfried

Siegfried Schmidt wrote:
>> Die letzte Zeile macht Access selber rein. Falls ein Timestamp Feld
>> fehlt, dann macht Access das mit einem Vergleich des Inhalts aller
>> Felder des DAtensatzes.
>
> Nicht des Datensatzes, sondern nur die Felder des aktuellen Recordsets.


Wenn Du meinst. Halt einfach die Felder des Datensatzes, die Access halt im
Recordset eingelesen hat. Die anderen kann es ja schwer vergleichen.

Gruss
Henry

Herbert Gottlieb

unread,
Feb 21, 2009, 10:11:19 AM2/21/09
to
Hallo Henry

Danke für die erklärung und den Tipp mit SmallDateTime auf DateTime zu
ändern.

Lieben Gruß,
Herbert

"Henry Habermacher" <DontSp...@psp-online.com> schrieb im Newsbeitrag
news:u9BM6NYk...@TK2MSFTNGP02.phx.gbl...

0 new messages