【问题标题】:Powershell inserting DataTable with SqlBulkCopy, that hold datetime columnsPowershell 使用 SqlBulkCopy 插入 DataTable,其中包含日期时间列
【发布时间】: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


    【解决方案1】:

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

    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 
    

    【讨论】:

      猜你喜欢
      • 2016-01-21
      • 1970-01-01
      • 2016-04-01
      • 2012-01-23
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 2016-06-02
      • 2021-03-22
      相关资源
      最近更新 更多