Powershell使用SqlBulkCopy插入DataTable,其中包含datetime列

时间:2017-03-01 12:02:31

标签: sql-server powershell datetime datatable sqlbulkcopy

我正在尝试使用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错误。

你们知道发生了什么吗?

1 个答案:

答案 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