phpbar.de logo

Mailinglisten-Archive

Re: WG: MySql + ODBC
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: WG: MySql + ODBC



Hi,

altbekanntes Problem von Access. Gibt auch genügend Webseiten darüber.

Der Hintergrund ist folgender:
Du hast eine Tabelle mit einem Primärindex, der als auto_increment
eingestellt ist. Das verhält sich ähnlich (nicht genauso) wie das
AutoWert-Feld in Access.

Wenn du einer Access-Tabelle einen neuen Datensatz beginnst, so vergibt
die Tabelle den AutoWert bereits, bevor der Datensatz in irgendeiner
Weise abgespeichert wurde. Das ID-Feld hat also bereits einen Wert,
solange der Datensatz noch "schwebend" ist. Bei einem SQL-Server geht
das nicht, denn die Spalte mit dem auto_increment-Primärindex würde ja
erst gefüllt, wenn der Datensatz auf dem Server gespeichert wird! Im
entsprechenden schwebenden Buffer in Access ist also das ID-Feld während
der Eingabe 0.

Jetzt will aber Access nach dem Abspeichern eines Datensatzes diesen
nochmal neu einlesen, um z.B. durch Default-Werte in der Tabelle
geänderte Daten zu aktualisieren. Access benutzt dafür den
Primärschlüssel. Dieser ist aber, wie wir wissen, auf der Access-Seite 0
gewesen, während der SQL-Server bereits das auto_increment angewendet
hat! Folglich kriegt Access eine leere Menge zurück.

Laut Microsoft-Dokumentation (da im Zusammenhang mit dem MSSQL-Server)
soll Access dann probieren, den Datensatz anhand der anderen Felder
eindeutig zu ermitteln. Ich konnte das allerdings noch nie sehen.

Umgekehrt steht in der mySQL-Doku, dass mySQL den Syntax SELECT * FROM
Table WHERE MyIndexColumn IS NULL unterstützt, da so Access die letzte
angefügte Zeile ermitteln würde. Ich habe da noch nicht weiter
experimentiert, aber ich vermute, Access fragt nach SELECT * FROM Table
WHERE myIndexColumn = 0, und das geht halt schief, s.o.!

Als Workaround für diese dumme Sache habe ich folgende Lösung genommen:
Ich habe eine DATETIME-Spalte erzeugt, die ich zum Primärindex mache.
Die Autoincrement-Spalte behält einen UNIQUE-Index. Dann verknüpfe ich
die Tabelle in Access. In meinen Forms muss ich jetzt nur noch bei
Form_BeforeInsert ein Me.MyDateColumn = Now hinzufügen, und es geht!
Jetzt kann man sogar auf dem mySQl-Server wieder die
Autoincrement-Spalte zum Primärindex machen, davon bekommt Access ja
nichts mit.

Diese Lösung hat 2 Nachteile: Zum einen muss man diese Umstellung immer
wieder machen, sobald man die Tabellen neu verknüpft oder updated (dafür
kann man allerdings eine SQL-Pass-Throug-Abfrage schreiben). Zum anderen
darf es nicht passieren, dass der Benutzer innerhalb einer Sekunde
mehrere Datensätze erzeugt oder zwei Clients zeitgleich einen Datensatz
erzeugen. Um letzteres zu beheben könnte man neben der DATETIME-Spalte
noch eine Spalte für die Benutzer-Kennung oder IP-Adresse dazufügen und
diese dann mit in den Primärindex aufnehmen. Oder man bastelt sich eine
alternative Now-Funktion, die für verschieden User z.B unterschiedliche
Jahrzehnte liefert.

Ich hoffe, ich konnte dir damit helfen...
Jan


Wallinger Herbert EI410 wrote:
> 
> Hallo miteinander
> 
> Wer kann mir weiterhelfen?
> 
> > MySQL version 3.22.27 läuft auf Linux 6.3 mit Apache Webserver
> > MyODBC Version 2.50.32 Für Win NT oder Win 95 als Datenbankschnittstelle
> > zu zur Windows Ebene
> >
> > Gibt es bekannte Probleme um mit Access 2000 über die ODBC-Schnittstelle
> > auf Mysql zuzugreifen, bei mir treten folgende Probleme auf:
> >
> > Wenn ich die Tabelle in Access verbinde, werden zwar alle Feldname korrekt
> > angezeigt, in den Datenfeldern steht jedoch nur         #Gelöscht
> > in einem Feld mit einem Auto-Inkrement unter Mysql wird überhautp nichts
> > angezeigt.
> >
> > Erzeuge ich in Access aus der verbunden MySQL Datei ein Formular, werden
> > die Datenfelder im ersten und im letzten Datensatz mit den korrekten
> > Werten, so wie sin in der MySQL Datenbank stehen, angezeigt. Alle
> > dazwischen liegenden Felder zeigen nur wieder den Eintrag    #Gelöscht.
> >
> > Wenn ich einen Datensatz unter Access verändere und ihn abpeichern will,
> > bekomme ich eine SQL Syntax-Fehlermeldung, obwohl ich unter Access selbst
> > keine SQL - Query's absetzen kann, macht alles Access automatisch.
> >
> > Wenn ich aus den gleichen Datengrundlagen Reports generiere und diese
> > ausdrucke, werden alle Datenfelder mit den korrekten Daten ausgedruckt,
> > bis auf das Feld mit dem Auto-Inkrement, diese Feld enthält in dem
> > Ausdruck keinen Wert.
> >
> >
> > Mit freundlichen Grüßen
> >
> > Herbert Wallinger
> > Produktentwicklung EI4
> > The Draexlmaier Group
> > Landshuter Str. 100
> > D-84137 Vilsbiburg
> > Phone:        +49 (0) 87 41 / 47 5727
> > mobile:       01 70 / 6 12 10 76
> > fax:  +49 (0) 87 41 / 47 5915
> > mailto:Wallinger.Herbert_(at)_draexlmaier.de
> > http://www.draexlmaier.de
> >
> >
> 
> ---
> *** Weitere Infos zur Mailingliste und MySQL unter www.4t2.com/mysql

---
*** Weitere Infos zur Mailingliste und MySQL unter www.4t2.com/mysql 


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive