Sql server Powershell使用SqlBulkCopy插入数据表,其中包含日期时间列

Sql server Powershell使用SqlBulkCopy插入数据表,其中包含日期时间列,sql-server,powershell,datetime,datatable,sqlbulkcopy,Sql Server,Powershell,Datetime,Datatable,Sqlbulkcopy,我正在尝试使用Data.SqlClient.SqlBulkCopy将预定义的DataTable插入SQL Server数据库 DataTable中有不同的数据类型,但问题在于Datetime列 像这个: $Datatable.Columns.Add((New-Object System.Data.DataColumn 'mydate',([datetime]))) 我在专栏里有数据,对我来说,它看起来不错 比如,如果我尝试$row.mydate.Month我会得到我期望的月份 因此,看起来da

我正在尝试使用
Data.SqlClient.SqlBulkCopy
将预定义的
DataTable
插入SQL Server数据库

DataTable
中有不同的数据类型,但问题在于
Datetime

像这个:

$Datatable.Columns.Add((New-Object System.Data.DataColumn 'mydate',([datetime])))
我在专栏里有数据,对我来说,它看起来不错

比如,如果我尝试
$row.mydate.Month
我会得到我期望的月份

因此,看起来datatable中填充了正确的数据

但是当我跑的时候

$bulkCopy.WriteToServer($DataTable)
我得到这个错误:

数据源中类型字符串的给定值无法转换为指定目标列的类型datetime

所以这是我第一件不明白的事。为什么它说我的数据类型是字符串,而它是datetime。
SqlBulkCopy
是否将所有数据转换为字符串

我试图直接在数据库中重现这个问题,这就是我得到的结果

它与日期的格式有关。我无法插入此
'22-02-2017'
。但是我可以插入这个
'02-22-2017'

因此,datetime类型显然存在一些混乱

为什么
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错误


你们知道发生了什么吗?

你们的数据集序列必须等于表列序列

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