Benutzer mit den meisten Antworten
Import Events in Database

Frage
-
Hallo,
ich würde gerne meine Events gerne in eine MSSQL Datenbank importieren. Dazu hätte ich dieses Script.
Alles Server laufen auf windows server 2008 R2
SQL: SQL 2012 Std.
$events = Get-WinEvent ForwardedEvents | Select-Object ID, LevelDisplayName, LogName, MachineName, Message, ProviderName, RecordID, TaskDisplayName, TimeCreated $connectionString = "Data Source=labdb001.lab.local;Integrated Security=true;Initial Catalog=EventCollections;" $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString $bulkCopy.DestinationTableName = "GeneralEvents" $dt = New-Object "System.Data.DataTable" # build the datatable $cols = $events | select -first 1 | get-member -MemberType NoteProperty | select -Expand Name foreach ($col in $cols) {$null = $dt.Columns.Add($col)} foreach ($event in $events) { $row = $dt.NewRow() foreach ($col in $cols) { $row.Item($col) = $event.$col } $dt.Rows.Add($row) } # Write to the database! $bulkCopy.WriteToServer($dt)
leider bekomme ich beim ausführen diesen Fehler.
Exception calling "WriteToServer" with "1" argument(s): "Received an invalid column length from the bcp client for coli d 3." At C:\Importevents.ps1:20 char:24 + $bulkCopy.WriteToServer <<<< ($dt) + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException
Kann mir vielleicht jemand helfen?
LG
Antworten
-
Die Fehler Meldung sagt ziemlich deutlich das die Spalte 3 (Colum ID 3 ) eine Spaltenüberschrift hat die zu lang ist.
Exportiere die Daten mal nach CSV und überprüfe die Daten "per Hand" mit einem Text Editor oder Excel.
Warum baust du denn die Colums so Kompliziert auf ? Du hast die Columnnamen doch schon in deinem Select befehl !
Ich würds so machen ;-) (ungetestet):
$Columns = 'ID', 'LevelDisplayName', 'LogName', 'MachineName', 'Message', 'ProviderName', 'RecordID', 'TaskDisplayName', 'TimeCreated' $connectionString = "Data Source=labdb001.lab.local;Integrated Security=true;Initial Catalog=EventCollections;" $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString $bulkCopy.DestinationTableName = "GeneralEvents" $dt = New-Object "System.Data.DataTable" # build the datatable $dt.Columns.AddRange($Columns) foreach ($event in (Get-WinEvent ForwardedEvents | Select-Object $Columns )) { $row = $dt.NewRow() foreach ($col in $Columns) { $row.Item($col) = $event.$col } $dt.Rows.Add($row) } # Write to the database! $bulkCopy.WriteToServer($dt)
Wenn der Fehler immer noch besteht ist wahrscheinlich der Inhalt von einer Zelle zu lang dieser müsste dann gekürzt werden.
Wenn der Typ der Column Text ist kann Sie nur 65535 Zeichen Aufnehmen.
http://stackoverflow.com/questions/3008267/sql-server-text-datatype-maxlength-65-535
http://msdn.microsoft.com/de-de/library/ms187993.aspx
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Als Antwort markiert Phil Reichl Dienstag, 8. April 2014 14:41
Alle Antworten
-
Die Fehler Meldung sagt ziemlich deutlich das die Spalte 3 (Colum ID 3 ) eine Spaltenüberschrift hat die zu lang ist.
Exportiere die Daten mal nach CSV und überprüfe die Daten "per Hand" mit einem Text Editor oder Excel.
Warum baust du denn die Colums so Kompliziert auf ? Du hast die Columnnamen doch schon in deinem Select befehl !
Ich würds so machen ;-) (ungetestet):
$Columns = 'ID', 'LevelDisplayName', 'LogName', 'MachineName', 'Message', 'ProviderName', 'RecordID', 'TaskDisplayName', 'TimeCreated' $connectionString = "Data Source=labdb001.lab.local;Integrated Security=true;Initial Catalog=EventCollections;" $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString $bulkCopy.DestinationTableName = "GeneralEvents" $dt = New-Object "System.Data.DataTable" # build the datatable $dt.Columns.AddRange($Columns) foreach ($event in (Get-WinEvent ForwardedEvents | Select-Object $Columns )) { $row = $dt.NewRow() foreach ($col in $Columns) { $row.Item($col) = $event.$col } $dt.Rows.Add($row) } # Write to the database! $bulkCopy.WriteToServer($dt)
Wenn der Fehler immer noch besteht ist wahrscheinlich der Inhalt von einer Zelle zu lang dieser müsste dann gekürzt werden.
Wenn der Typ der Column Text ist kann Sie nur 65535 Zeichen Aufnehmen.
http://stackoverflow.com/questions/3008267/sql-server-text-datatype-maxlength-65-535
http://msdn.microsoft.com/de-de/library/ms187993.aspx
PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
auf der deutschsprachigen PowerShell Community
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+- Als Antwort markiert Phil Reichl Dienstag, 8. April 2014 14:41