Format einer GUID

Frage:
Eine SQL Server-Tabelle beinhaltet eine Spalte vom Datentyp uniqueidentifier. Die Daten dieser Spalte werden in Access in einem anderen Format verarbeitet. Wodurch wiederum der SQL Server die Daten nicht korrekt erkennt. Auch die Access-Funktion stringfromguid(guidwert) kann den Wert nicht korrekt aufbereiten. Wie muss die GUID formatiert werden?

Lösung:
Die Access-Funktion stringfromguid(guidwert) liefert die GUID im Format {guid{70330CDA-4C92-495B-9365-B0465565F825}}.
SQL Server erwartet die GUID jedoch im Format ‚70330CDA-4C92-495B-9365-B0465565F825‘.

/* übernommen aus der Original sqlfaq.de */

Autowert nach Insert ermitteln

Frage:
Per VBA wird ein neuer Datensatz in einer SQL Server-Tabelle hinzugefügt. Dabei erhält dieser Datensatz einen neuen Autowert (Identity).
Wie lässt sich dieser neue Wert in VBA weiterverwenden?

Lösung:
Im Gegensatz zu Access wird der neue Wert in SQL Server erst nach dem Einfügen des neuen Datensatzes erzeugt. Um diesen neuen Wert zu ermitteln, muss der Datensatz also erneut gelesen werden. Dazu sollte das Recordset zum Einfügen der Datensätze mit der Option dbSeeChanges geöffnet sein.
Hierzu ein Beispiel von Elmar Boye:

Sub GetIdentityODBC()
Dim dbs As DAO.Database
Dim rst As DAO.Recordset

Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset(„SELECT * FROM Basis“, dbOpenDynaset, dbSeeChanges)
rst.AddNew
rst!BasisText = „Ein Wert“
rst!MemoFeld = „Ein Memo Wert“
rst.Update
Debug.Print rst!BasisID, rst!BasisDatum
rst.Move 0, rst.LastModified
Debug.Print rst!BasisID, rst!BasisDatum
rst.Close
End Sub  

/* übernommen aus der Original sqlfaq.de */

Aufruf einer Gespeicherten Prozedur aus einer MDB

Frage:
In Access soll eine Gespeicherte Prozedur aufgerufen werden.

Lösung:
Es gibt verschiedene Möglichkeiten, die in der Access-Hilfe ausführlich beschrieben sind. Hier ein paar Stichpunkte:

1) Passthrough-Abfrage (DAO)
Mit der Passthrough-Abfrage wird direkt auf den SQL Server zugegriffen. Die Ausführung der Anweisung erfolgt hierbei in T-SQL.
DECLARE @var1 int
EXEC spName @var1 OUTPUT
SELECT @var1

2) ODBC-Direkt (DAO)
Mit ODBC-Direkt wird die Gespeicherte Prozedur und die zugehörigen Parameter per VBA definiert und aufgerufen.

3) ADO
Mit ADO lässt sich eine
Gespeicherte Prozedur entweder über die dafür verfügbaren Methoden oder per connection.execute ausführen.

/* übernommen aus der Original sqlfaq.de */

Datumsformat für SQL Server

Frage:
In welchem Format muss ein Datum an den SQL Server übergeben werden?

Lösung:
Das Datum kann als String in verschiedenen Formaten übergeben werden. Die sicherste Variante ist das ISO-Format (yyyymmdd).
Die Online-Hilfe des SQL Servers bietet unter den Stichworten Convert und Cast eine Auflistung der möglichen Datumsformate und Konvertierungen.

/* übernommen aus der Original sqlfaq.de */

Text- und Memofelder bei eingebundenen Tabellen vom Typ ‚Text 255‘

Frage:
Die Text- und Memospalten einer in Access eingebundenen SQL Server-Tabelle werden nur bis zu einer Länge von 255 Zeichen unterstützt.
Obwohl die SQL Server-Tabelle Textspalten mit längeren Definitionen und auch Memofelder enthält.

Lösung:
Spalten vom Typ nchar, nvarchar bzw. ntext werden in Access 97 als text (255) eingebunden, da Access 97 keine Unicode-Datentypen erkennt.
Diese werden erst ab Access 2000 unterstützt.

/* übernommen aus der Original sqlfaq.de */

Primärschlüssel einer Sicht in Access

Frage:
Die Daten einer in Access eingebundenen SQL Server-Sicht lassen sich nur ändern, wenn diese einen Primärschlüssel besitzt.
Wie aber kann zu einer Sicht ein Primärschlüssel definiert werden?

Lösung:
Ein
Primärschlüssel lässt sich beim Einbinden der Sicht in die Access-Datenbank vergeben. Anschließend steht dieser Primärschlüssel nur innerhalb Access zur Verfügung. Hierzu ein Beispielskript von Elmar Boye: vieweinbinden.zip

/* übernommen aus der Original sqlfaq.de */

Verbindung ohne DSN

Frage:
In eine Access-Datenbank sollen die Tabellen einer SQL Server-Datenbank nicht über eine ODBC-Datenquelle, sondern vielmehr DSN-less eingebunden werden.
Was ist bei der Verbindungszeichenfolge anzugeben?

Lösung:
ODBC;DRIVER={SQL Server};SERVER=servername;DATABASE=datenbankname;UID=benutzername;PWD= kennwort
Die Parameter Uid und Pwd können bei der NT-Authentifizierung entfallen und durch Trusted_Connection=Yes ersetzt werden.

Optional kann der String um folgende Parameter erweitert werden:
APP=applikationsname;WSID=workstationId;AUTOTRANSLATE=yes/no;REGIONAL=yes/no

/* übernommen aus der Original sqlfaq.de */

Schreibkonflikt bei verknüpften Tabellen

Frage:
D
ie Datenänderung an einer in Access eingebundenen SQL Server-Tabelle wird mit der Fehlermeldung „Schreibkonflikt: Dieser Datensatz wurde seit Beginn der Bearbeitung von einem anderen Benutzer geändert … “ abgebrochen – obwohl nur ein Benutzer mit der Datenbank arbeitet. Die in der Fehlermeldung enthaltene Schaltfläche Eigene Änderungen verwerfen ist zudem noch deaktiviert.

Lösung:
Der Schreibkonflikt wird durch
Datentypen verursacht, die in SQL Server und Access mit unterschiedlichen Genauigkeiten arbeiten.
Bei einer Datenänderung werden die Werte aller Spalten miteinander verglichen, um festzustellen, ob es seit dem Einlesen des Datensatzes eine Datenänderung von anderer Seite gab. Nun unterscheiden sich die Werte durch die unterschiedlichen Genauigkeiten, die Access und SQL Server bei Gleitkommazahlen verwenden. Dieser Unterschied wird als zwischenzeitige Änderung interpretiert und löst die Fehlermeldung aus.
Der Vergleich der einzelnen Spalten kann vermieden werden, indem die SQL Server-Tabelle um eine Spalte vom Datentyp timestamp erweitert wird. Bei einer Datensatzänderung wird dann nur der Wert dieser Spalte verglichen. Eine timestamp-Spalte beinhaltet dabei kein Datum, sondern vielmehr eine GUID, die den aktuellen Stand des Datensatzes abbildet.

/* übernommen aus der Original sqlfaq.de */