2009-07-26 4 views
6

Po pierwsze, chciałbym podziękować tym, którzy odpowiedzieli na moje poprzednie pytania. Jesteście niesamowici!!!Jak spętać Datareader i utworzyć DataTable w Powershell

Oto moje pytanie: Chciałbym zapytać mój serwer sql Przechowywanie procedury i zwrócić datareader. Jednak chcę stworzyć z tego tabelę. Tej tabeli użyję do załadowania programu Excel za pomocą nowych poleceń CommandX OpenSQL. Kod nie powiedzie się, gdy próbuję zbudować DataTable. Nie sądzę, że poprawnie wstawiam nowy obiekt "System.Object []". Oto co mam do tej pory:

$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 

Odpowiedz

3

nie mam pojęcia jak to zrobić w PowerShell, ale w .net to zrobić tak:

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

Po prostu dodaj znaki dolara ($) w odpowiednich miejscach :-) – onupdatecascade

15

Przełożenie Mladen's answer do PowerShell jest całkiem prosto do przodu :

$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 

Jednakże, jeśli wystarczy DataTable plecy, nie trzeba zadzwonić ExecuteReader na polecenia, można utworzyć DataAdapter i używać, aby wypełnić 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 
Powiązane problemy