Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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
C#:如何在插入到DateTimeOffset SQL Server列时停止将时区偏移量添加到System.DateTime_C#_Sql Server_Timezone Offset_Datetimeoffset - Fatal编程技术网

C#:如何在插入到DateTimeOffset SQL Server列时停止将时区偏移量添加到System.DateTime

C#:如何在插入到DateTimeOffset SQL Server列时停止将时区偏移量添加到System.DateTime,c#,sql-server,timezone-offset,datetimeoffset,C#,Sql Server,Timezone Offset,Datetimeoffset,我有一些C#代码,它从一个数据库复制行并将它们插入另一个数据库。它使用DataTable和SqlBulkCopy来实现这一点 当导入到我的C#应用程序中时,时间戳列在插入SQL Server的DataTable中具有数据类型System.DateTime。执行SqlBulkCopy.WriteToServer()后,目标表中的时间戳值的类型为datetimeoffset(6),并添加了时区偏移量(…+01:00) 我如何阻止这种情况发生?这并不总是发生,只是最近才开始发生 更新: 出于我的目的,

我有一些C#代码,它从一个数据库复制行并将它们插入另一个数据库。它使用
DataTable
SqlBulkCopy
来实现这一点

当导入到我的C#应用程序中时,时间戳列在插入SQL Server的
DataTable
中具有数据类型
System.DateTime
。执行
SqlBulkCopy.WriteToServer()
后,目标表中的时间戳值的类型为
datetimeoffset(6)
,并添加了时区偏移量(…+01:00)

我如何阻止这种情况发生?这并不总是发生,只是最近才开始发生

更新:

出于我的目的,预期时区始终为UTC。但是,出于业务原因,我不得不将其存储在datetimeoffset列中。所以我期待+00:00

DataTable data = importer.GetDataTable();

using (SqlBulkCopy copy = new SqlBulkCopy(conn)){
   copy.WriteToServer(data);
}

如果您有一个
DateTime
并尝试将其写入
DateTimeOffset
C,则必须确定使用哪个时区。有显式转换函数允许您指定,但如果您不指定,它将假定
DateTime
在本地时区(大部分时间都在本地时区)


提供了几个有关如何在两者之间转换的示例。请注意,
SpecifyKind
不需要有
DateTimeOffset
类型。

如果有
DateTime
并尝试将其写入
DateTimeOffset
C,则必须确定要使用的时区。有显式转换函数允许您指定,但如果您不指定,它将假定
DateTime
在本地时区(大部分时间都在本地时区)

提供了几个有关如何在两者之间转换的示例。请注意,
SpecifyKind
不需要有
DateTimeOffset
类型。

在将时间戳列插入Sql Server之前,在时间戳列上使用DateTime.SpecifyKind()对我不起作用

我通过将
System.DateTime
列转换(强制转换)为
DateTimeOffset
,显式偏移量为
newtimespan(0,0,0)
,解决了这个问题。这消除了C#隐式处理从
DateTime
DbType.DateTimeOffset
的转换的需要,该转换添加了不需要的偏移量

编辑

在阅读评论时,@JohnSkeet基本上推荐了这一点,但我并没有阅读每个人的评论。

在将时间戳列插入Sql Server之前,在时间戳列上使用DateTime.SpecifyKind()对我来说不起作用

我通过将
System.DateTime
列转换(强制转换)为
DateTimeOffset
,显式偏移量为
newtimespan(0,0,0)
,解决了这个问题。这消除了C#隐式处理从
DateTime
DbType.DateTimeOffset
的转换的需要,该转换添加了不需要的偏移量

编辑


在阅读评论时,@JohnSkeet基本上推荐了这一点,但我没有阅读每个人的评论。

那么你期望的时区是什么
datetimeoffset
总是有一个时区,所以如果你问如何删除它,答案就是你没有。如果您不想要时区,请不要使用
datetimeoffset
@Larnu签出我对question@ScottHannen请参阅我的更新:)向我们展示您用于将数据插入SQL实例的代码。此文档可能会有所帮助。它处理
SqlBulkCopy
如何转换
DateTime
以及一些您可以更改的设置。那么您期望的时区是什么呢
datetimeoffset
总是有一个时区,所以如果你问如何删除它,答案就是你没有。如果您不想要时区,请不要使用
datetimeoffset
@Larnu签出我对question@ScottHannen请参阅我的更新:)向我们展示您用于将数据插入SQL实例的代码。此文档可能会有所帮助。它处理
SqlBulkCopy
如何转换
DateTime
以及您可以更改的一些设置。转换由SqlBulkCopy处理,因此我无法使用这些显式转换函数:/I将尝试更改数据表的定义方式以利用此功能(将其更改为使用datetimeoffset而不是DateTime)@TurgidWizard:我认为Kind是在
DateTime
中指定的。您可以通过调用
SpecifyKind
并将结果存储回
DataTable
来覆盖每个
DateTime
。这是一个很好的建议,但似乎不起作用:(我更改了填充DataTable的代码,以检查列是否为System.DateTime,如果为,则使用colArray[I]=DateTime.SpecifyKind(DataReader[I],DateTimeKind.Utc)填充值)…但是,在插入sql Server时仍会添加偏移量转换由SqlBulkCopy处理,因此我无法使用这些显式转换函数:/I将尝试更改数据表的定义方式以利用此功能(将其更改为使用datetimeoffset而不是datetime)@TurgidWizard:我认为Kind是在
DateTime
中指定的。您可以通过调用
SpecifyKind
并将结果存储回
DataTable
来覆盖每个
DateTime
。这是一个很好的建议,但似乎不起作用:(我更改了填充DataTable的代码,以检查列是否为System.DateTime,如果为,则使用colArray[I]=DateTime.SpecifyKind(DataReader[I],DateTimeKind.Utc)填充值)。但是,在插入sql server时仍会添加偏移量