Fehler beim Hinzufügen eines Datensatzes zur SQL Server-Tabelle mit Dem Standardwert im Datetime-Feld.

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

  1. 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] 
    GO
    
  2. Fü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 datetime Feld 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").Value
    

    Sie erhalten die oben erwähnte Fehlermeldung, wenn Sie die Value-Eigenschaft des datetime Felds untersuchen.