Ошибка выполнения хранимой процедуры в Powershell

У меня есть сценарий powershell, который принимает пользовательский ввод, который я планирую использовать для выполнения хранимой процедуры. sproc принимает несколько параметров для настройки возвращаемых данных. Однако, когда я запускаю этот код powershell, я получаю следующую ошибку:

Cannot index into a null array.
At C:\Report.ps1:119 char:42
+     foreach ($Row in $global:DataSet.Tables[ <<<< 0].Rows)
+ CategoryInfo          : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Это код powershell, который я использую для выполнения вызова хранимой процедуры.

# Create Shared Helper Objects
$nl = [Environment]::NewLine

function msg
{
    param($message,$fgcolor="white",$bgcolor="black")
    $output = Write-Host $message -ForegroundColor $fgcolor -BackgroundColor $bgcolor
    write-output $output
}
Set-Location "C:\"

$month = Read-Host "Enter Report Month"
$year = Read-Host "Enter Report Year"
msg "$nl Choose a product" "White"
$prompt = ' [D] Desktop  [M] Mobile'
switch (Read-Host $prompt) {
"D" {$product = "Desktop"; break}
"M" {$product = "Mobile"; break}
}
msg "$nl Select a Make" "White"
$prompt = ' [F] First [L] Last '
switch (Read-Host $prompt) {
"F" {$SiteMake = "First"; break}
"L" {$SiteMake = "Last"; break}
}
msg "$nl Select a Product" "White"
$prompt = ' [E] Extra [B] Basic'
switch (Read-Host $prompt) {
"E" {$SitePackage = "Extra"; break}
"B" {$SitePackage = "Basic"; break}
}

# Create Database Connection Function
function ConnectSproc
{
param ($SQLServer, $SQLDBName, $SqlQuery)
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection  
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True"  
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand  
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure
    # Report Month
    $SqlCmd.Parameters.Add("@ReportMonth",[system.data.SqlDbType]::VarChar) | out-Null
    $SqlCmd.Parameters["@ReportMonth"].Direction = [system.data.ParameterDirection]::Input
    $SqlCmd.Parameters["@ReportMonth"].value = $month
    # Report Year
    $SqlCmd.Parameters.Add("@ReportYear",[system.data.SqlDbType]::VarChar) | out-Null
    $SqlCmd.Parameters["@ReportYear"].Direction = [system.data.ParameterDirection]::Input
    $SqlCmd.Parameters["@ReportYear"].value = $year
    # Product
    $SqlCmd.Parameters.Add("@Product",[system.data.SqlDbType]::VarChar) | out-Null
    $SqlCmd.Parameters["@Product"].Direction = [system.data.ParameterDirection]::Input
    $SqlCmd.Parameters["@Product"].value = $product
    # Site Make
    $SqlCmd.Parameters.Add("@SiteMake",[system.data.SqlDbType]::VarChar) | out-Null
    $SqlCmd.Parameters["@SiteMake"].Direction = [system.data.ParameterDirection]::Input
    $SqlCmd.Parameters["@SiteMake"].value = $SiteMake
    # Site Package
    $SqlCmd.Parameters.Add("@SitePackage",[system.data.SqlDbType]::VarChar) | out-Null
    $SqlCmd.Parameters["@SitePackage"].Direction = [system.data.ParameterDirection]::Input
    $SqlCmd.Parameters["@SitePackage"].value = $SitePackage
$SqlCmd.Connection = $SqlConnection  
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter  
$SqlAdapter.SelectCommand = $SqlCmd  
$DataSet = New-Object System.Data.DataSet  
$SqlAdapter.Fill($DataSet) | Out-Null  
$SqlConnection.Close()  
$DataSet.Tables[0]
}

ConnectSproc "servername" "databasename" "mysproc"

Я в растерянности. Любая помощь будет оценена по достоинству!

Обновление: на самом деле похоже, что процедура даже не выполняется правильно. Это, вероятно, объяснило бы ошибку, которую я получаю. Теперь я не уверен, почему sproc не выполняется.


person Aaron Hancock    schedule 14.12.2012    source источник


Ответы (2)


Я понял. В итоге возникла проблема с областью видимости, когда переменная $DataSet создавалась внутри функции и не имела префикса «$global:»

Чтобы исправить это, я изменил

$DataSet = New-Object System.Data.DataSet в $global:DataSet = New-Object System.Data.DataSet и ссылался на него как $global:DataSet.Tables[0] вне функции.

person Aaron Hancock    schedule 14.12.2012

Возможно, вызов Fill() не удался. Временно закомментируйте | Out_Null часть $SqlAdapter.Fill($DataSet) | Out-Null и посмотрите, прольет ли это свет.

person DWright    schedule 14.12.2012