Powershell che inserisce DataTable con SqlBulkCopy, che contiene colonne datetime

datatable datetime powershell sqlbulkcopy sql-server

Domanda

Sto cercando di inserire un DataTable predefinito in un database SQL Server, utilizzando Data.SqlClient.SqlBulkCopy .

Esistono diversi tipi di dati nel DataTable , ma il problema riguarda le colonne Datetime .

Come questo:

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

Ho dati nella colonna, e per me sembra a posto.

Come se $row.'mydate'.Month ricevo il mese che mi aspetterei.

Quindi sembra che il datatable sia popolato con i dati corretti.

Ma quando corro

$bulkCopy.WriteToServer($DataTable)

Ottengo questo errore:

Il valore dato di tipo String dall'origine dati non può essere convertito in tipo datetime della colonna di destinazione specificata

Quindi questa è la prima cosa che non capisco. Perché dice che il mio tipo di dati è una stringa, quando è datetime. SqlBulkCopy converte tutti i dati in stringhe?

Ho provato a riprodurre il problema direttamente sul database, e questo è quello che ho ottenuto.

Ha qualcosa a che fare con la formattazione della data. Non riesco a inserire questo '22-02-2017' . Ma posso inserire questo '02-22-2017' .

Quindi ovviamente c'è una certa confusione nei tipi datetime.

Perché SqlBulkCopy tenta di inserire "22" come mese anziché giorno, quando i dati chiari sono corretti nel datatable.

Sto pensando che potrebbe essere una cosa culturale. Ma la cultura del database e la mia cultura workstation sembrano essere allineati. Comunque ho provato a cambiare la cultura del mio script di Powershell, in questo modo:

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

Questo cambia giorno e mese, quando scrivo i dati sulla console, ma non ha alcun effetto sull'errore BulkCopy.

Ragazzi avete idea di cosa sta succedendo?

Risposta popolare

La sequenza del set di dati deve essere uguale alla sequenza di colonne della tabella.

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 


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché