Sql Server tablosuna Datetime alanında varsayılan değere sahip kayıt eklemek için istemci imlecini kullandığınızda hata oluştu

Bu makale, Datetime alanında varsayılan değere sahip SQL Server tablosuna kayıt eklemek için istemci imlecini kullandığınızda oluşan sorunu çözmenize yardımcı olur.

Özgün ürün sürümü: SQL Server
Özgün KB numarası: 279888

Belirtiler

İstemci tarafı kayıt kümesi aracılığıyla yeni bir kaydı varsayılan değere sahip null atanamaz datetime bir alana sahip bir SQL Server tablosuna eklemek için ADO kullanırsanız, alan için datetime bir değer sağlamazsanız aşağıdaki hata iletisini alırsınız:

Çalışma zamanı hatası '-2147217887 (80040e21)': Çok adımlı işlem hatalar oluşturdu. Her durum değerini denetleyin.

Bu hata, SQL Server için OLE DB Sağlayıcısını veya ODBC Sürücüleri için OLE DB Sağlayıcısı'nı kullanmanız fark etmeksizin oluşur. Microsoft Veri Erişim Bileşenleri (MDAC) sürüm 2.5 Service Pack 1 (SP1) veya önceki bir sürümü kullandığınızda hata iletisi farklı olabilir. Bu hata sunucu tarafı imleçte oluşmaz.

Neden

Bu hata, türünün DBTYPE_DBTIMESTAMP DBTYPE_VARIANTdeğerini olarak dönüştürmeye çalıştığında İstemci İmleç Altyapısı'nda oluşur.

Çözüm

Bu sorunu geçici olarak çözmenin birkaç yolu vardır:

  • Kayıt kümesi için sunucu tarafı imleci kullanın.
  • Veritabanındaki alan için belirtilen varsayılan değeri kaldırın.
  • Yeni bir kayıt eklediğinizde her zaman alan için bir değer belirtin.

Davranışı Yeniden Oluşturma Adımları

  1. SQL Server'a null değerleri kabul etmeyen ve varsayılan değeri olan bir tarih saat alanı içeren bir tablo ekleyin. En az bir ek alan ekleyin. Bu makale için aşağıdaki SQL Server 2000 tablosu oluşturulur:

    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. Tabloya satır eklemek için aşağıdaki koda benzer bir kod çalıştırın.

    Not

    Bu kodu çalıştırmadan önce Kullanıcı Kimliği =<UID> ve parola =<strong parola> değerlerini doğru değerlerle değiştirmeniz gerekir. UID'nin <> bu işlemi veritabanında gerçekleştirmek için uygun izinlere sahip olduğundan emin olun. Ayrıca, alan için bir değer sağlamadığınızdan datetime emin olun.

     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
    

    Alanın Value özelliğini datetime incelediğinizde yukarıda bahsedilen hata iletisini alırsınız.