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
-
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 -
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").ValueU ontvangt het hierboven vermelde foutbericht wordt weergegeven wanneer u de eigenschap Value van het datum/tijd-veld.