2009-07-26 66 views
6

首先让我感谢那些回答了我以前的问题的人。你们真棒!如何循环数据记录器并在PowerShell中创建DataTable

这是我的问题: 我喜欢查询我的sql服务器存储过程并返回一个datareader。不过,我想创建一个表。我将使用该表使用新的Powershell OpenXML命令行开关加载Excel。当我尝试构建DataTable时,代码失败。我不认为我正确地调用了新对象“System.Object []”。以下是我走到这一步:

$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 

回答

3

我不知道如何在PowerShell中,但做到这一点.NET你做这样的:

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

只需在正确的位置添加美元符号($):-) – onupdatecascade 2009-07-26 17:45:33

15

翻译Mladen's answer到PowerShell是相当直截了当:

$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 

但是,如果你只需要一个数据表背,你不需要调用ExecuteReaer方法的命令,你可以创建一个DataAdapter并用它来填补数据表:

$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