none
Access Connection zu SQL Server per VBA: schreiben nicht möglich RRS feed

  • Frage

  • Moin!

    Ich habe eine MS SQL 2012 Datenbank und Access 2010. Wenn ich in Access die Verbindung zur SQL-Datenbank manuell herstelle (externe Daten, ODBC, DSN auswählen), funktioniert alles, wie gewünscht, schreiben ist möglich.

    Wenn ich die Verbindung zur SQL-Datenbank in VBA realisiere (siehe hier: http://support.microsoft.com/kb/892490/de, vorzugsweise Variante 1, DSN-lose Verbindung, habe zum Test aber auch Variante 2 mit dem gleichen Ergebnis ausprobiert), kann ich die Tabellen zwar lesen, aber nicht hineinschreiben. Schon alleine die Zeile für einen neuen Datensatz wird nicht angezeigt und selbst Eingaben in ein vorhandenes Feld werden nicht einmal angenommen, d.h., ich kann den vorhandenen Wert noch nicht einmal ändern.

    Wenn ich mir die Eigenschaften der ODBC-Verbindungen anschaue, sehen beide gleich aus. Die Datenbank, in die ich schreiben will, ist selbst erstellt und auch die Berechtigungen habe ich selbst erteilt. Ich verwende einen speziellen User für den Zugriff (UID und Passwort in VBA hinterlegt), habe aber testweise auch meinen Domänenuser hinzugefügt, ebenfalls ohne Erfolg.

    Wo ist der Unterschied zwischen den manuell angelegten und den per VBA-Script erzeugten SQL-Connections und was muss ich tun, damit ich mit der VBA-Variante in meine Datenbank schreiben kann?

    Grüße aus dem Norden

    der Jörg

    Freitag, 19. September 2014 07:18

Antworten

  • Hallo Jörg,

    wenn Du in MS Access Tabellen vom SQL Server verknüpfst, dann müssen die Tabellen auf dem SQL Server zwingend einen Primary Key haben, andernfalls kann MS Access die Datensätze nicht eindeutig identifizieren und erlaubt dann keinen schreibenden Zugriff auf die SQL Server Daten. Haben bei Dir alle Tabellen einen Primary Key (oder Unique Index)?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 19. September 2014 07:38
  • Hallo Jörg,

    wie man die DSN erstellt ist, gehopst wie gesprungen. Sinnvollerweise sollte man die für die verknüpften Tabellen ein RefreshLink ausführen, damit die von Access gespeicherten Metadaten und dem SQL Server übereinstimmen.

    Entscheidend ist, dass der Aufbau der Tabelle identisch ist und immer muss ein Primärschlüssel (oder eindeutiger Schlüssel) vorhanden sein, sonst sind keine Änderungen möglich.

    Die Information wird nicht über die Verbindung festgelegt, sondern wird von aus den vom SQL Server gelieferten Informationen extrahiert und gespeichert.

    Ich vermute mal, Du hast keinen Primärschlüssel festgelegt, sondern es über den Dialog angegeben, den Access bei "schlüssellosen" Tabellen und Sichten anbietet - was für Tabellen sinnnfrei wäre, denn zusätzliche (eindeutige) Indizes sollte man nur für Sichten verwenden.

    Prüfe bitte (via SSMS), ob die Tabellen im SQL Server einen Primärschlüssel haben. Wenn nicht lege ihn an und aktualisiere die Verknüpfungen.

    Gruß Elmar

    Freitag, 19. September 2014 07:55

Alle Antworten

  • Nachtrag:

    Ich habe gerade doch einen Unterschied festgestellt: bei der manuell angelegten Verbindung gebe ich immer die ID-Spalte als eindeutig an, das fehlt in der VBA-Version. Wenn ich die manuelle Verbindung ohne Angabe der eindeutigen Spalte erstelle, kann ich ebenfalls nicht schreiben, d.h., das scheint dann wohl das Problem zu sein.

    Wie kann ich also entweder diese Information im Connectionstring mit übergeben oder was muss ich evtl. ändern, damit das keine Auswirkung hat?

    Freitag, 19. September 2014 07:36
  • Hallo Jörg,

    wenn Du in MS Access Tabellen vom SQL Server verknüpfst, dann müssen die Tabellen auf dem SQL Server zwingend einen Primary Key haben, andernfalls kann MS Access die Datensätze nicht eindeutig identifizieren und erlaubt dann keinen schreibenden Zugriff auf die SQL Server Daten. Haben bei Dir alle Tabellen einen Primary Key (oder Unique Index)?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 19. September 2014 07:38
  • Hallo Olaf,

    ja, bei mir haben alle Tabellen die ID-Spalte, die entsprechend konfiguriert ist. Mit der manuell eingerichteten Verbindung funktioniert es deswegen, weil ich die Spalte dort im Assistenten auswähle (siehe mein Nachtrags-Post, den ich vermutlich gesendet habe, als Du gerade geschrieben hast).

    der Jörg

    Freitag, 19. September 2014 07:47
  • Hallo Jörg,

    wie man die DSN erstellt ist, gehopst wie gesprungen. Sinnvollerweise sollte man die für die verknüpften Tabellen ein RefreshLink ausführen, damit die von Access gespeicherten Metadaten und dem SQL Server übereinstimmen.

    Entscheidend ist, dass der Aufbau der Tabelle identisch ist und immer muss ein Primärschlüssel (oder eindeutiger Schlüssel) vorhanden sein, sonst sind keine Änderungen möglich.

    Die Information wird nicht über die Verbindung festgelegt, sondern wird von aus den vom SQL Server gelieferten Informationen extrahiert und gespeichert.

    Ich vermute mal, Du hast keinen Primärschlüssel festgelegt, sondern es über den Dialog angegeben, den Access bei "schlüssellosen" Tabellen und Sichten anbietet - was für Tabellen sinnnfrei wäre, denn zusätzliche (eindeutige) Indizes sollte man nur für Sichten verwenden.

    Prüfe bitte (via SSMS), ob die Tabellen im SQL Server einen Primärschlüssel haben. Wenn nicht lege ihn an und aktualisiere die Verknüpfungen.

    Gruß Elmar

    Freitag, 19. September 2014 07:55
  • Hallo Olaf,

    ich fürchte, ich war etwas voreilig: Dein Hinweis mit dem Primärschlüssel hat mich drauf gebracht: er war tatsächlich nicht definiert. Ich hatte lediglich das Autoincrement und Identity eingestellt, nicht aber den Primärschlüssel. Kurz nachgeholt - funktioniert. Danke für den Zaunpfahl!

    Als Info für Kollegen mit dem gleichen Problem: so geht's, das habe ich übersehen:

    http://msdn.microsoft.com/de-de/library/ms189039.aspx

    Grüße aus dem Fast-Wochenende

    der Jörg

    Freitag, 19. September 2014 08:01
  • Hallo Elmar,

    ja, bin gerade durch die Antwort von Olaf auch schon drauf gekommen, danke aber für Deine genauere Erklärung!

    der Jörg

    Freitag, 19. September 2014 08:04