2

使用 EntityFramework v4.1 和 IBM Data Server Client v9.7fp5,DB 首先基于具有 DATE 列的预定义 DB2 表生成代码。DB2 DATE 列在代码生成期间映射到 .NET DateTime 数据类型。

尝试INSERT一行时,收到以下错误

错误 [22008] [IBM] CLI0114E 日期时间字段溢出。SQLSTATE=22008

这是有道理的,因为 .NET 没有 DATE 数据类型,只有 DATETIME 并且该属性将包含比 DB2 DATE 列所期望的更多的数据。

问题是

  1. 为什么 .NET 基本代码不使用 ToShortDateString() 自动转换并为 DB2 提供它所期望的?

  2. 在 .NET 将 SQL 事务提交给 DB2 之前,可以使用哪些方法来覆盖 .NET 基本逻辑并转换应用程序代码中的值?

任何帮助或反馈将不胜感激。谢谢!

4

1 回答 1

5

读取日期时间数据类型转换 (ODBC)。它定义了各种规则datatype conversions。下面列出了一个 - SQLSTATE 22008。

如果在从 C 转换到 SQL 时发生秒数或小数秒的截断,则会生成带有 SQLSTATE 22008 的诊断记录和消息“日期时间字段溢出”。

这里的关键是确保truncation在秒/小数秒内没有发生

日期数据类型

如果 DB2 数据库列是DATE数据类型,请创建如下所列的变量:

new DateTime(2012,3,4); //No time part

TIMESTAMP 数据类型

如果 DB2 数据库列是TIMESTAMP数据类型,则删除毫秒的小数部分:

dateTime = new DateTime(dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond),dateTime.Kind);

参考

  1. 如何从 .NET DateTime 中截断毫秒
  2. 为什么 SQL Server 会丢失一毫秒?

DATE 和 TIMESTAMP 的 DB2 INSERT

如果您在 DB2 中使用直接 SQL 语句插入,

对于时间戳使用格式,如“2012-12-17-16.53.57.285754”

对于 DATE 使用格式,如 CAST ('2012-12-10' AS DATE)

于 2013-01-08T12:45:08.203 回答