Powershell: Insert Into innerhalb einem Foreach
Hallo zusammen,
ich hatte bisher noch nichts mit SQL über Powershell zu tun und hatte mich deshalb etwas schlau gemacht.
Ziel ist innerhalb einer Foreach-Schleife rekursiv alle Dateien einer FileExtension zu suchen, auszulesen und den Wert nebst Dateiname, Datum etc in eine Tabelle abzulegen. Das rekursive suchen habe ich soweit durch, da ich tausende Dateien durchgehen muss, möchte ich nicht erst alle Filenamen in eine Variable ablegen und dann durchgehen sondern gleich mit der Bearbeitung der gefundenen Files beginnen.
Also suchte ich nach Infos wie man eine SQL Tabelle ansprechen kann.
Testweise kann ich eine Verbindung zum SQL-Server aufbauen und ein Select auf eine Test-Tabelle durchführen, somit ist der Zugang gegeben.
Was aber ist die beste Vorgehensweise um guten Code zu schreiben/haben der auch bei mehr als 200.000 Files (aktueller Stand) am schnellsten in einer Schleife die Daten zusammensetz und den Insert zum Server absetzt?
Im Grund ist es quasi ein 'INSERT INTO [dbo].[Files] ([Name],[LastWriteTime],[Lenght]) VALUES ($Name,$LastWriteTime,$Lenght);' für jedes File was nach Muster gefunden wird.
Nun habe ich mal getestet ein System.Data.SqlClient.SqlDataAdapter zu verwenden und dem Adapter ein SqöCommand mit Parameter zuzuweisen, aber wie ist es am besten? Besser erst pro Zeile ein DataSet zu erstellen (mit Spaltennamen der Tabelle), befüllen, dem Adapter zuweisen, ausführen und dann mit Dispose zu löschen um dann wieder mit New-Object zu arbeiten?
Entschuldig die Fragestellung, aber ich möchte von Anfang an die "richtige" Lösung verwenden die mir im Betrieb dann kein Problem bereitet.
Was ist zu empfehlen?
Gruss,
Daniel
PS: Nein, bin nicht zu faul um selber was zu schreiben, ich möchte nur das stabilste bzw für den Zweck beste verwenden/lernen
ich hatte bisher noch nichts mit SQL über Powershell zu tun und hatte mich deshalb etwas schlau gemacht.
Ziel ist innerhalb einer Foreach-Schleife rekursiv alle Dateien einer FileExtension zu suchen, auszulesen und den Wert nebst Dateiname, Datum etc in eine Tabelle abzulegen. Das rekursive suchen habe ich soweit durch, da ich tausende Dateien durchgehen muss, möchte ich nicht erst alle Filenamen in eine Variable ablegen und dann durchgehen sondern gleich mit der Bearbeitung der gefundenen Files beginnen.
Also suchte ich nach Infos wie man eine SQL Tabelle ansprechen kann.
Testweise kann ich eine Verbindung zum SQL-Server aufbauen und ein Select auf eine Test-Tabelle durchführen, somit ist der Zugang gegeben.
Was aber ist die beste Vorgehensweise um guten Code zu schreiben/haben der auch bei mehr als 200.000 Files (aktueller Stand) am schnellsten in einer Schleife die Daten zusammensetz und den Insert zum Server absetzt?
Im Grund ist es quasi ein 'INSERT INTO [dbo].[Files] ([Name],[LastWriteTime],[Lenght]) VALUES ($Name,$LastWriteTime,$Lenght);' für jedes File was nach Muster gefunden wird.
Nun habe ich mal getestet ein System.Data.SqlClient.SqlDataAdapter zu verwenden und dem Adapter ein SqöCommand mit Parameter zuzuweisen, aber wie ist es am besten? Besser erst pro Zeile ein DataSet zu erstellen (mit Spaltennamen der Tabelle), befüllen, dem Adapter zuweisen, ausführen und dann mit Dispose zu löschen um dann wieder mit New-Object zu arbeiten?
Entschuldig die Fragestellung, aber ich möchte von Anfang an die "richtige" Lösung verwenden die mir im Betrieb dann kein Problem bereitet.
Was ist zu empfehlen?
Gruss,
Daniel
PS: Nein, bin nicht zu faul um selber was zu schreiben, ich möchte nur das stabilste bzw für den Zweck beste verwenden/lernen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 435056
Url: https://administrator.de/contentid/435056
Ausgedruckt am: 18.11.2024 um 01:11 Uhr
3 Kommentare
Neuester Kommentar
Hi,
am einfachsten wäre es doch, entweder jede einzelne Insert-Anweisung an den SQL-Server zu senden, oder alle 200.000 auf einmal oder eben in Gruppen von Dir bestimmter Anzahl, z.B. 1000 Stk. oder so.
Also ein Array oder Liste mit den einzelnen Insert-Anweisungen erstellen, und diese alle mit einem System.Data.SqlClient.SQLCommand.ExecuteNonQuery absenden.
E.
am einfachsten wäre es doch, entweder jede einzelne Insert-Anweisung an den SQL-Server zu senden, oder alle 200.000 auf einmal oder eben in Gruppen von Dir bestimmter Anzahl, z.B. 1000 Stk. oder so.
Also ein Array oder Liste mit den einzelnen Insert-Anweisungen erstellen, und diese alle mit einem System.Data.SqlClient.SQLCommand.ExecuteNonQuery absenden.
E.
- SQLDataAdapter mit einem initialen Select erstellen
- Datatable erstellen
- Datatable mit "FillSchema" des Datadapters füllen
- SqlCommandBuilder erstellen mit Dataadapter als Parameter (erstellt automatische die Insert Methode anhand des initialen Selects)
- In der Schleife eine neue Datarow erstellen und die Eigenschaften des files der Datarow zuweisen und dann der Datatable hinzufügen.
- Zum Schluss (oder in der Schleife nach einer Anzahl an Items) die Update()-Methode des Dataadapters aufrufen und die Datatable leeren (datatable.Rows.Clear())
Bitte, keine Ursache.