Грешка при изпълнение на съхранена процедура в 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