【发布时间】:2017-03-01 12:02:31
【问题描述】:
我正在尝试使用 Data.SqlClient.SqlBulkCopy 将预定义的 DataTable 插入 SQL Server 数据库。
DataTable 中有不同的数据类型,但问题在于Datetime 列。
喜欢这个:
$Datatable.Columns.Add((New-Object System.Data.DataColumn 'mydate',([datetime])))
我的列中有数据,对我来说它看起来不错。
如果我尝试$row.'mydate'.Month,我会得到我期望的月份。
所以看起来数据表填充了正确的数据。
但是当我运行时
$bulkCopy.WriteToServer($DataTable)
我得到这个错误:
来自数据源的String类型的给定值不能转换为指定目标列的日期时间类型
所以这是我不明白的第一件事。为什么它说我的数据类型是字符串,而它是日期时间。 SqlBulkCopy 是否将所有数据转换为字符串?
我试图直接在数据库上重现问题,这就是我得到的。
这与日期的格式有关。我不能插入这个'22-02-2017'。但我可以插入这个'02-22-2017'。
显然日期时间类型存在一些混淆。
为什么SqlBulkCopy 尝试插入“22”作为月份而不是日期,而数据表中的数据显然是正确的。
我认为这可能是一种文化问题。但是数据库文化和我的工作站文化似乎是一致的。不过,我确实尝试过改变我的 Powershell 脚本的文化,如下所示:
function Set-Culture([System.Globalization.CultureInfo] $culture)
{
[System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture
[System.Threading.Thread]::CurrentThread.CurrentCulture = $culture
}
$culture = [System.Globalization.CultureInfo]::GetCultureInfo('en-US')
Set-Culture $culture
当我将数据写入控制台时,这确实会切换日期和月份,但不会影响 BulkCopy 错误。
你们知道发生了什么吗?
【问题讨论】:
标签: sql-server powershell datetime datatable sqlbulkcopy