Compartilhar via


Erro ao usar o cursor do cliente para adicionar registro à tabela do SQL Server que tem valor padrão no campo Datetime

Este artigo ajuda a resolver o problema que ocorre quando você usa o cursor do cliente para adicionar um registro à tabela do SQL Server que tem o valor padrão no campo Datetime.

Versão original do produto: SQL Server
Número original do KB: 279888

Sintomas

Se você usar o ADO para inserir um novo registro por meio de um conjunto de registros do lado do cliente em uma tabela do SQL Server que tenha um campo não anulável datetime com um valor padrão, receberá a seguinte mensagem de erro se não fornecer um valor para o datetime campo:

Erro em tempo de execução '-2147217887 (80040e21)': erros gerados por operação em várias etapas. Verifique cada valor de status.

Esse erro ocorre se você usar o Provedor OLE DB para SQL Server ou o Provedor OLE DB para Drivers ODBC. A mensagem de erro pode ser diferente quando você usa o Microsoft Data Access Components (MDAC) versão 2.5 Service Pack 1 (SP1) ou anterior. Esse erro não ocorre com um cursor do lado do servidor.

Causa

Esse erro ocorre no Client Cursor Engine quando ele tenta converter o valor do tipo DBTYPE_DBTIMESTAMP para DBTYPE_VARIANT.

Solução

Existem várias maneiras de contornar esse problema:

  • Use um cursor do lado do servidor para o conjunto de registros.
  • Remova o valor padrão especificado para o campo no banco de dados.
  • Sempre especifique um valor para o campo ao adicionar um novo registro.

Etapas para reproduzir o comportamento

  1. Adicione uma tabela ao SQL Server que contenha um campo datetime que não aceite nulos e que tenha um valor padrão. Inclua pelo menos um campo adicional. Para este artigo, a seguinte tabela do SQL Server 2000 é criada:

    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. Para inserir uma linha na tabela, execute um código semelhante ao código a seguir.

    Observação

    Você deve alterar o ID de usuário =<UID> e a senha =<senha forte> para os valores corretos antes de executar esse código. Certifique-se de que <o UID> tenha as permissões apropriadas para executar esta operação no banco de dados. Além disso, certifique-se de não fornecer um valor para o datetime campo.

     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
    

    Você recebe a mensagem de erro mencionada acima quando examina a propriedade Value do datetime campo.