2017-03-01 77 views
0

我试图使用Data.SqlClient.SqlBulkCopy将预定义的DataTable插入到SQL Server数据库中。Powershell使用SqlBulkCopy插入DataTable,它包含datetime列

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

赞一个:

$Datatable.Columns.Add((New-Object System.Data.DataColumn 'mydate',([datetime]))) 

我在列数据,并且对我来说这看起来不错。

如果我尝试$row.'mydate'.Month我得到我期望的月份。

所以它看起来像数据表填充正确的数据。

但是当我运行

$bulkCopy.WriteToServer($DataTable) 

我得到这个错误:

The given value of type String from the data source cannot be converted to type datetime of the specified target column

所以这是我不明白的第一件事。为什么它说我的数据类型是字符串,当它是日期时间。 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

您的数据集序列必须等于表列顺序。

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