我正在尝试使用DataTable
将预定义的Data.SqlClient.SqlBulkCopy
插入SQL Server数据库。
DataTable
中有不同的数据类型,但问题出在Datetime
列。
喜欢这个:
$Datatable.Columns.Add((New-Object System.Data.DataColumn 'mydate',([datetime])))
我在列中有数据,对我而言看起来很好。
就像我尝试$row.'mydate'.Month
一样,我得到了我期望的月份。
所以看起来数据表中填充了正确的数据。
但是当我跑步时
$bulkCopy.WriteToServer($DataTable)
我收到此错误:
数据源中String类型的给定值无法转换为指定目标列的datetime类型
所以这是我没有得到的第一件事。为什么它说我的数据类型是字符串,当它是datetime时。 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错误。
你们知道发生了什么吗?
答案 0 :(得分:0)
您的数据集序列必须等于表列序列。
CREATE TABLE [dbo].[tmp](
[IP] [varchar](16) NOT NULL,
[USER] [nvarchar](50) NOT NULL,
[DT] [date] NOT NULL
PS> $DataSet
IP User DT
-- ---- --
172.16.11.11 SysCopyUser 2017-05-11 15:29:29