Symptom

Om du använder ADO för att infoga en ny post genom en postmängd på klientsidan i en SQL Server-tabell som har ett icke-null datetime-fält med ett standardvärde, visas följande felmeddelande om du inte anger något värde för datum / tidsfält:

Körfel '-2147217887 (80040e21)': flera steg åtgärden genererade fel. Kontrollera alla statusvärden.

Det här felet uppstår om du använder OLE DB-Provider för SQL Server- eller OLE DB-providern för ODBC-drivrutiner. Felmeddelandet kan variera när du använder Microsoft Data Access Components (MDAC) version 2.5 Service Pack 1 (SP1) eller tidigare. Det här felet uppstår inte med en markör på serversidan.

Orsak

Det här felet uppstår i motorn för klienten markören vid försök att konvertera värdet av typen DBTYPE_DBTIMESTAMP till DBTYPE_VARIANT.

Lösning

Det finns flera sätt att undvika problemet:

  • Använda en markör på serversidan för postmängden.

  • Ta bort standardvärdet som har angetts för fältet i databasen.

  • Ange alltid ett värde för fältet när du lägger till en ny post.

Status

Microsoft har bekräftat att detta är ett programfel i Microsoft-produkterna som nämns i början av denna artikel.

Mer Information

Åtgärder för att återskapa problemet

  1. Lägga till en tabell för SQL-Server som innehåller ett datum / tidsfält som inte accepterar null-värden och som har ett standardvärde. Inkludera minst ett fält. I följande tabell i SQL Server 2000 har skapats för den här artikeln:

    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. Om du vill infoga en rad i tabellen, kör kod som liknar följande kod.

    Obs! Du måste ändra användar-ID = < UID > och lösenord = < lösenord > rätt innan du kör den här koden. Kontrollera att < UID > har behörighet att utföra åtgärden på databasen. Kontrollera också att du inte anger något värde för datum / tidsfält.

        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

    Felmeddelandet det ovannämnda visas när du kontrollerar egenskapen värde för datetime-fältet.

Behöver du mer hjälp?

Utöka dina kunskaper

UTFORSKA UTBILDNING >

Få nya funktioner först

ANSLUT TILL MICROSOFT INSIDERS >

Hade du nytta av den här informationen?

Hur nöjd är du med språkkvaliteten?
Vad påverkade din upplevelse?

Tack för din feedback!

×