Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel hilft Ihnen, das Problem zu beheben, das auftritt, wenn Sie den Clientcursor verwenden, um datensatz zur SQL Server-Tabelle hinzuzufügen, die den Standardwert im Feld "Datetime" aufweist.
Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 279888
Problembeschreibung
Wenn Sie ADO verwenden, um einen neuen Datensatz über ein clientseitiges Recordset in eine SQL Server-Tabelle mit einem nicht nullfähigen datetime Feld mit einem Standardwert einzufügen, wird die folgende Fehlermeldung angezeigt, wenn Sie keinen Wert für das datetime Feld angeben:
Laufzeitfehler "-2147217887 (80040e21)": Fehler beim Mehrfachschrittvorgang. Überprüfen Sie jeden Statuswert.
Dieser Fehler tritt auf, ob Sie den OLE DB-Anbieter für SQL Server oder den OLE DB-Anbieter für ODBC-Treiber verwenden. Die Fehlermeldung kann sich unterscheiden, wenn Sie Microsoft Data Access Components (MDAC) Version 2.5 Service Pack 1 (SP1) oder früher verwenden. Dieser Fehler tritt nicht mit einem serverseitigen Cursor auf.
Ursache
Dieser Fehler tritt im Clientcursormodul auf, wenn versucht wird, den Wert des Typs DBTYPE_DBTIMESTAMP in DBTYPE_VARIANT.
Lösung
Es gibt mehrere Möglichkeiten, dieses Problem zu umgehen:
- Verwenden Sie einen serverseitigen Cursor für das Recordset.
- Entfernen Sie den Standardwert, der für das Feld in der Datenbank angegeben ist.
- Geben Sie immer einen Wert für das Feld an, wenn Sie einen neuen Datensatz hinzufügen.
Schritte zum Reproduzieren des Verhaltens
Fügen Sie sql Server eine Tabelle hinzu, die ein Datetime-Feld enthält, das keine Nullwerte akzeptiert und einen Standardwert aufweist. Schließen Sie mindestens ein zusätzliches Feld ein. Aus Gründen dieses Artikels wird die folgende SQL Server 2000-Tabelle erstellt:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DateTest]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[DateTest] GO CREATE TABLE [dbo].[DateTest] ([DateId] [int] IDENTITY (1, 1) NOT NULL , [TestDate] [datetime] NOT NULL , [Nonsense] [varchar] (16) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[DateTest] WITH NOCHECK ADD CONSTRAINT [DF_DateTest_TestDate] DEFAULT ('3/1/2001') FOR [TestDate], PRIMARY KEY CLUSTERED ([DateId] ) ON [PRIMARY] GOFühren Sie Code aus, der dem folgenden Code ähnelt, um eine Zeile in die Tabelle einzufügen.
Notiz
Sie müssen die Benutzer-ID =<UID> und das Kennwort =<sicheres Kennwort> in die richtigen Werte ändern, bevor Sie diesen Code ausführen. Stellen Sie sicher, dass die <UID> über die entsprechenden Berechtigungen zum Ausführen dieses Vorgangs in der Datenbank verfügt. Stellen Sie außerdem sicher, dass Sie keinen Wert für das
datetimeFeld angeben.Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Set cnn = New ADODB.Connection cnn.Open "Provider=SQLOLEDB;Data Source=(local);" & _ "Initial Catalog=test;User Id=<UID>;Password=<strong password>;" Set rst = New ADODB.Recordset With rst .CursorLocation = adUseClient .Open "SELECT * FROM DateTest", cnn, adOpenStatic, adLockOptimistic .AddNew .Fields("Nonsense").Value = "test data" .Update End With Debug.Print rst("TestDate").ValueSie erhalten die oben erwähnte Fehlermeldung, wenn Sie die Value-Eigenschaft des
datetimeFelds untersuchen.