Sql server dbFailOnError SQL Server datetime错误,仅限时间值
我在SQL Server中有一个带有datetime列的链接表,我在其中存储一个仅限时间的值*。如果我在没有dbFailOnError的情况下执行更新查询,它会将该命令转换为SELECT命令,后面跟着每次执行一行的各个UPDATE语句:Sql server dbFailOnError SQL Server datetime错误,仅限时间值,sql-server,datetime,ms-access,defects,Sql Server,Datetime,Ms Access,Defects,我在SQL Server中有一个带有datetime列的链接表,我在其中存储一个仅限时间的值*。如果我在没有dbFailOnError的情况下执行更新查询,它会将该命令转换为SELECT命令,后面跟着每次执行一行的各个UPDATE语句: exec sp_executesql N'UPDATE "dbo"."Appeals" SET "HearingTime"=@P1 WHERE "AppealID" = @P2' ,
exec sp_executesql N'UPDATE "dbo"."Appeals" SET "HearingTime"=@P1
WHERE "AppealID" = @P2'
,N'@P1 datetime,@P2 int','1899-12-30 09:00:00',1
...
exec sp_executesql N'UPDATE "dbo"."Appeals" SET "HearingTime"=@P1
WHERE "AppealID" = @P2'
,N'@P1 datetime,@P2 int','1899-12-30 09:00:00',4
如果执行完全相同的更新查询,但使用dbFailOnError,则会得到以下转换:
UPDATE "dbo"."Appeals" SET HearingTime={t '09:00:00'}
有趣的是,dbFailOnError强制在后端进行更高效的更新,但我真正关心的是时间值本身
在第一个示例中,Access将日期时间正确设置为1899年12月30日(MS Access神奇的“零”日)。在第二种情况下,这种情况不会发生。最终的结果是,第一个示例“有效”,而第二个示例无效
我的意思是,如果我在数据表视图中查看HearingTime字段,Access会将第一个字段显示为:
9:00:00 AM
第二个显示为(在撰写本文时,2016年9月3日是今天的日期):
我不得不假设这是微软的一个错误。还是我在这里遗漏了什么?我有没有更好的选择,而不是报告错误,只是希望微软有一天能修复它
*是的,我知道SQL Server中有一个
时间
数据类型。它与MS-Access-datetime类型不兼容,因此在MS-Access链接表中对我几乎没有用处。这是一个好问题,我可以复制它
这似乎是ODBC驱动程序中的一个错误,因为您演示的行为是SQL Server的行为,ODBC驱动程序应该对此进行补偿,正如在第一个示例中所做的那样,它提供了完整的日期时间字符串,当在Access中读回时,该字符串将正确转换
除了在读回数据时将TimeValue应用于日期时间值之外,我看不到其他解决方法。然而,这将停止对时间域索引的任何使用
SQL Server的数据类型Time不能用于很多事情,因为ODBC驱动程序将其读取为文本。我能够使用Access SQL日期/时间文本查询重现您的问题。两者
Dim cdb作为DAO.Database
设置cdb=CurrentDb
cdb.执行“更新dbo_上诉集听证时间=#10:00:00#”,DBFailOneError
及
Dim cdb作为DAO.Database
设置cdb=CurrentDb
cdb.执行“更新dbo_上诉集听证时间=#1899-12-30 11:00:00”,DBFailOneError
导致[HearingTime]值为当前日期(2016-09-03),而不是“零”日期
但是,以字符串形式传递完整的日期/时间似乎是可行的
Dim cdb作为DAO.Database
设置cdb=CurrentDb
cdb.执行“更新dbo_上诉集听证时间='1899-12-30 12:00:00',dbFailOnError
(省略字符串值中的日期部分会导致SQL Server的[HearingTime]值DATETIME
“零”日期为1900-01-01。)
而且,更好的是,带有DAO.QueryDef
对象的参数化查询似乎也能正常工作
Dim cdb作为DAO.Database
设置cdb=CurrentDb
将qdf设置为DAO.QueryDef
设置qdf=cdb.CreateQueryDef(“”_
“参数prmHearingTime DateTime;”和_
“更新dbo_上诉集HearingTime=[prmHearingTime]”)
qdf!prmHearingTime=#上午10:00:00#
qdf.executedbfailonerror
是的,字符串表示法似乎有效。有趣。此解决方案似乎也适用于本地Jet/ACE表。因此,它应该足够安全,可以用作任何Jet/ACE/SQLServer表的通用解决方案。它可能也适用于其他后端,如MySQL或PostgreSQL,但我没有测试其中任何一个。您使用的是哪种ODBC驱动程序?你试过不同的吗?哪个版本的SQL Server?我正在使用{SQL Server}驱动程序(SQLSRV32.dll)。但是{SQL Server Native Client 11.0}(SQLNCLI11.dll)和{SQL Server Native Client 10.0}(SQLNCLI10.dll)也有同样的行为。对于{ODBC Driver 11 for SQL Server}(MSODBCSQL11.dll)和{ODBC Driver 13 for SQL Server}(MSODBCSQL13.dll),我也得到了相同的行为。
9/3/2016 9:00:00 AM