當加入記錄至 SQL Server 資料表裡的日期時間欄位有預設值的情況下,您在使用用戶端資料指標的錯誤: 錯誤


狀況


如果您使用 ADO 有不可為 null 的日期時間欄位,預設值的 SQL Server 資料表中插入新的記錄,用戶端的資料錄集時,您收到下列錯誤訊息,如果您不提供日期時間欄位的值:
執行階段錯誤 '-2147217887 (80040e21)': 多重步驟產生的作業錯誤。請檢查每個狀態值。
是否您使用 OLE DB 提供者用於 SQL Server 或 OLE DB 提供者的 ODBC 驅動程式時,發生此錯誤。錯誤訊息可能不同,當您使用 Microsoft 資料存取元件 (MDAC) 2.5 版 Service Pack 1 (SP1) 或更早版本。使用伺服器端資料指標不會發生這個錯誤。

原因


嘗試將 DBTYPE_DBTIMESTAMP 型別的值轉換成 DBTYPE_VARIANT 時,用戶端資料指標引擎中會發生此錯誤。

解決方案


有幾種方式可以解決這個問題:
  • 使用伺服器端資料指標的資料錄集。
  • 移除指定的資料庫中欄位的預設值。
  • 加入新的記錄時,請永遠指定欄位的值。

狀態


Microsoft 已確認這是本文開頭所列的 Microsoft 產品中的錯誤。

更多的資訊


若要重現問題的步驟

  1. 新增要包含日期時間欄位不接受 null 值,SQL Server 的資料表具有預設值。包含至少一個其他的欄位。這是因為這份文件,會建立下列的 SQL Server 2000年資料表:
    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. 若要將資料列插入資料表中,執行類似下列的程式碼的程式碼。

    注意您必須變更使用者識別碼 = < UID > 及密碼 < 強式密碼 > = 成正確值,執行這個程式碼。請確定 < UID > 具有適當的權限,才能執行此作業,在資料庫上。此外,請確定您沒有提供日期時間欄位的值。
        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
    當您檢查的日期時間欄位的 [] 屬性時,您會收到上述的錯誤訊息。