2014-10-30 65 views
2

上的SQL Server 2005,我定義如下表:()SQLDATETIME溢出

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[DebugTrace](
    [Timestamp] [datetime] NOT NULL CONSTRAINT [DF_DebugTrace_Timestamp] DEFAULT (getdate()), 
    [Log] [nvarchar](max) NOT NULL, 
    [id] [int] IDENTITY(1,1) NOT NULL, 
CONSTRAINT [PK_DebugTrace] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

正如你所看到的,時間戳列有一個默認值設置爲GETDATE。

從SQL Server Management Studio中(SQL服務器上本地運行),下面的代碼罰款運行:

insert into DebugTrace ([Log]) 
values ('test') 

「相同」 的代碼跑到我的工作站失敗:

DebugTrace trace = new DebugTrace(); 
trace.Log = "test from code"; 
DebugTraces.InsertOnSubmit(trace); 
SubmitChanges(); 

的拋出的異常是:

SqlDateTime溢出。必須介於1/1/1753 12:00:00 AM和 12/31/9999 11:59:59 PM之間。

這兩個請求都不設置時間戳,並依靠默認值來設置列值。因此,GetDate()函數如何觸發這樣的異常?

P.S.請求是從不同的計算機運行,但使用相同的Windows帳戶

回答

0

DebugTrace的屬性是否映射到TimeStamp,具有默認值?從代碼插入時嘗試給它一個默認值

DebugTrace trace = new DebugTrace(); 
trace.Log = "test from code"; 
trace.TimeStamp= Datetime.Now; 

您的問題是,插入時,時間戳保持爲空。所以它可能是你的默認值約束不能正常工作。看看這個link,它精確地闡述了你的問題。

+1

感謝您的回答。你提到的鏈接有所幫助。使用Linqpad執行相同的操作可以查看實際傳遞給SQL服務器的內容: - 區域參數 DECLARE p0 DateTime SET p0 ='0001-01-01 00:00:00.000' DECLARE p1 NVarChar(1000)SET p1 = '從代碼測試' - EndRegion INSERT INTO [debugTrace的]([時間戳],[日誌]) VALUES(P0,P1) SELECT CONVERT(中間體,SCOPE_IDENTITY())AS [值] – Jaepetto 2014-10-30 11:27:17