Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server dbFailOnError SQL Server datetime错误,仅限时间值_Sql Server_Datetime_Ms Access_Defects - Fatal编程技术网

Sql server dbFailOnError SQL Server datetime错误,仅限时间值

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' ,

我在SQL Server中有一个带有datetime列的链接表,我在其中存储一个仅限时间的值*。如果我在没有dbFailOnError的情况下执行更新查询,它会将该命令转换为SELECT命令,后面跟着每次执行一行的各个UPDATE语句:

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