【问题标题】:SqlDateTime overflowSqlDateTime 溢出
【发布时间】:2014-10-30 18:41:21
【问题描述】:

在 SQL Server 2005 上,我有一个表定义如下:

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]

如您所见,Timestamp 列的默认值设置为 GetDate()。

从 SQL Server Management Studio(在 SQL Server 上本地运行),以下代码运行良好:

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

我的工作站运行的“相同”代码失败:

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

抛出的异常是:

SqlDateTime 溢出。必须在 1753 年 1 月 1 日凌晨 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59。

两个请求都没有设置 Timestamp 并且依赖默认值来设置列值。那么GetDate()函数怎么会触发这样的异常呢?

附:请求是从不同的机器上运行但使用相同的 Windows 帐户

【问题讨论】:

    标签: tsql


    【解决方案1】:

    DebugTrace 的属性是否映射到 TimeStamp,是否有默认值?从您的代码插入时尝试给它一个默认值

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

    您的问题是插入时,时间戳保持为空。因此,可能是您的默认值约束无法正常工作。看看这个link,它准确地阐述了你的问题。

    【讨论】:

    • 感谢您的回答。你提到的链接有帮助。使用 Linqpad 执行相同的操作可以查看实际传递给 SQL 服务器的内容: -- 区域参数 DECLARE p0 DateTime SET p0 = '0001-01-01 00:00:00.000' DECLARE p1 NVarChar(1000) SET p1 = ' test from code' -- EndRegion INSERT INTO [DebugTrace]([Timestamp], [Log]) VALUES (p0, p1) SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多