Fehler: Fehler beim Clientcursor verwenden, um SQL Server Tabelle Datensatz hinzufügen, die standardmäßig in Datetime-Feld


Problembeschreibung


Verwenden Sie ADO zum Einfügen eines neuen Datensatzes durch einen clientseitigen Recordset in einer SQL Server-Tabelle, die NULL-Datetime-Feld mit einem Standardwert, erhalten Sie folgende Fehlermeldung, wenn Sie keinen Wert für Datetime-Feld angeben:
Laufzeitfehler '-2147217887 (80040e21)': Multiple-Step-Vorgang erzeugte Fehler. Überprüfen Sie jeden Statuswert.
Dieser Fehler tritt auf, ob die OLE DB-Provider für SQL Server oder OLE DB-Provider für ODBC-Treiber verwenden. Die Fehlermeldung abweichen, bei Verwendung von Microsoft Data Access Components (MDAC) Version 2.5 Service Pack 1 (SP1) oder früher. Dieser Fehler tritt nicht mit einem serverseitigen Cursor.

Ursache


Dieser Fehler tritt im Client Cursor Engine, wenn versucht wird, den Wert des Typs DBTYPE_DBTIMESTAMP DBTYPE_VARIANT konvertieren.

Problemlösung


Es gibt mehrere Wege, dieses Problem zu umgehen:
  • Verwenden Sie einen serverseitigen Cursor für das Recordset.
  • Entfernen Sie den Standardwert für das Feld in der Datenbank angegeben ist.
  • Geben Sie einen Wert für das Feld immer wenn Sie einen neuen Datensatz hinzufügen.

Status


Microsoft hat bestätigt, dass es sich um einen Fehler in den Microsoft-Produkten handelt, die zu Beginn dieses Artikels aufgeführt sind.

Weitere Informationen


Schritte zum Reproduzieren des Verhaltens

  1. Fügen Sie eine Tabelle zu SQL Server, die ein Datetime-Feld enthält, die keine NULL-Werte und die akzeptiert einen Standardwert hat hinzu. Enthalten Sie mindestens ein weiteres Feld. Für diesen Artikel 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. Um eine Zeile in die Tabelle einzufügen, führen Sie Code ähnlich dem folgenden Code.

    Hinweis Ändern Sie Benutzer ID = < UID > und Kennwort = < sicheres Kennwort > auf die richtigen Werte, bevor Sie diesen Code ausführen. Stellen Sie sicher, dass < UID > die entsprechenden Berechtigungen für diesen Vorgang in der Datenbank verfügt. Stellen Sie außerdem sicher, dass Sie keinen Wert für 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 genannte Fehlermeldung beim Untersuchen der Value -Eigenschaft des Datetime-Feld