BUG: Fout bij gebruik van clientcursor Record toe te voegen aan de SQL Server-tabel met standaardwaarde in het veld Datum/tijd


Symptomen


Als u ADO een nieuwe record in een recordset aan de clientzijde invoegen in een SQL Server-tabel met een niet null datum/tijd-veld met een standaardwaarde gebruikt, wordt het volgende foutbericht weergegeven als u een waarde voor de datum/tijd-veld niet opgeeft:
Runtime-fout "-2147217887 (80040e21)": meerdere stappen bewerking gegenereerde fouten. Controleer alle statuswaarden.
Deze fout treedt op of u de OLE DB-Provider voor SQL Server of de OLE DB-Provider voor ODBC-stuurprogramma's. Het foutbericht kan verschillen wanneer u Microsoft Data Access Components (MDAC) versie 2.5 Service Pack 1 (SP1) of lager. Deze fout treedt niet op met een cursor aan de serverzijde.

Oorzaak


Deze fout treedt op in de Client Cursor Engine wanneer wordt geprobeerd de waarde van het type DBTYPE_DBTIMESTAMP converteren naar DBTYPE_VARIANT.

Oplossing


Er zijn verschillende manieren om dit probleem te omzeilen:
  • Een cursor aan de serverzijde gebruiken voor de recordset.
  • De standaardwaarde die is opgegeven voor het veld in de database verwijderen.
  • Altijd een waarde voor het veld opgeven als u een nieuwe record toevoegt.

Status


Microsoft heeft bevestigd dat dit zich kan voordoen in de Microsoft-producten die aan het begin van dit artikel worden vermeld.

Meer informatie


Stappen om het probleem te reproduceren

  1. Toevoegen aan een tabel met SQL Server met een datum/tijd-veld geen null-waarden en die accepteert een standaardwaarde heeft. Ten minste één extra veld bevatten. Voor dit artikel, is in de volgende tabel voor SQL Server 2000 gemaakt:
    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. Als u wilt een rij in de tabel invoegen, code die vergelijkbaar is met de volgende code worden uitgevoerd.

    Opmerking Moet u gebruikers-ID = < UID > en wachtwoord = < wachtwoord > op de juiste waarden voordat u deze code uitvoert. Zorg dat < UID > heeft de juiste machtigingen voor deze bewerking uitvoeren op de database. Zorg er ook voor dat u een waarde voor de datum/tijd-veld niet opgeeft.
        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
    U ontvangt het hierboven vermelde foutbericht wordt weergegeven wanneer u de eigenschap Value van het datum/tijd-veld.