2009-07-26 9 views
6

Prima di tutto vorrei ringraziare quelle persone che hanno risposto alle mie precedenti domande. Voi ragazzi siete fantastici!!!Come eseguire il ciclo di Datareader e creare DataTable in PowerShell

Ecco la mia domanda: mi piace per interrogare la mia procedura di server SQL Stored e restituire un DataReader. Comunque voglio creare un tavolo fuori da esso. Quella tabella che userò per caricare Excel usando i nuovi comandi Powershell OpenXML. Il codice non funziona quando provo a creare il DataTable. Non penso di presentare il nuovo oggetto "System.Object []" correttamente. Ecco quello che ho ottenuto finora:

$sqlConnection = new-object System.Data.SqlClient.SqlConnection "server=localhost;database=Demo;Integrated Security=sspi" 
$sqlConnection.Open() 

#Create a command object 
$sqlCommand = $sqlConnection.CreateCommand() 
$sqlCommand.CommandText = "EXEC Demo.usp_GetTableValueParameter_Data" 

#Execute the Command 
$sqlReader = $sqlCommand.ExecuteReader() 

#Parse the records 

$sqlReader | &{ begin{$values = new-object "System.Object[]" $sqlReader["Name"], $sqlReader["Level_Desc"], $sqlReader["Level"]} process {$_.GetValues($values); $datatable.Rows.Add($values)}} 

##$datatable | format-table -autosize 

# Close the database connection 
$sqlConnection.Close() 

#STARTING OPENXML PROCESS 
#---------------------------- 
$xlsFile = "C:\Temp\Data.xlsx" 
$datatable | Export-OpenXmlSpreadSheet -OutputPath $xlsFile -InitialRow 3 

risposta

3

non ho idea di come fare questo in PowerShell, ma in .net lo si fa in questo modo:

DataTable dt = new DataTable(); 
dt.Load(yourSqlReader); 
+1

Basta aggiungere segni di dollaro ($) nei punti giusti :-) – onupdatecascade

15

Traducendo Mladen's answer in PowerShell è piuttosto semplice :

$sqlConnection = new-object System.Data.SqlClient.SqlConnection "server=localhost;database=Demo;Integrated Security=sspi" 
$sqlConnection.Open() 

#Create a command object 
$sqlCommand = $sqlConnection.CreateCommand() 
$sqlCommand.CommandText = "EXEC Demo.usp_GetTableValueParameter_Data" 

#Execute the Command 
$sqlReader = $sqlCommand.ExecuteReader() 

$Datatable = New-Object System.Data.DataTable 
$DataTable.Load($SqlReader) 

# Close the database connection 
$sqlConnection.Close() 

#STARTING OPENXML PROCESS 
#---------------------------- 
$xlsFile = "C:\Temp\Data.xlsx" 
$datatable | Export-OpenXmlSpreadSheet -OutputPath $xlsFile -InitialRow 3 

Tuttavia, se avete solo bisogno di una schiena DataTable, non c'è bisogno di chiamare ExecuteReader sul comando, è possibile creare un DataAdapter e l'uso che per riempire il DataTable:

$sqlConnection = new-object System.Data.SqlClient.SqlConnection "server=localhost;database=Demo;Integrated Security=sspi" 
$sqlConnection.Open() 

#Create a command object 
$sqlCommand = $sqlConnection.CreateCommand() 
$sqlCommand.CommandText = "EXEC Demo.usp_GetTableValueParameter_Data" 

$adapter = New-Object System.Data.SqlClient.SqlDataAdapter $sqlcommand 
$dataset = New-Object System.Data.DataSet 

$adapter.Fill($dataSet) | out-null 

# Close the database connection 
$sqlConnection.Close() 

$datatable = $dataset.Tables[0] 

#STARTING OPENXML PROCESS 
#---------------------------- 
$xlsFile = "C:\Temp\Data.xlsx" 
$datatable | Export-OpenXmlSpreadSheet -OutputPath $xlsFile -InitialRow 3 
Problemi correlati