SCOrchDev-SQL.psm1

#requires -Version 2
<#
    .Synopsis
        Uses ADO .NET to query SQL
 
    .Description
        Queries a SQL Database and returns a datatable of results
 
    .Parameter query
        The SQL Query to run
  
    .Parameter parameters
        A list of SQLParameters to pass to the query
 
    .Parameter connectionString
        Sql Connection string for the DB to connect to
 
    .Parameter timeout
        timeout property for SQL query. Default is 60 seconds
 
    .Parameter Credential
        if specified the credential will be used to connect to an SMA box and launch
        the SQL query as the target user.
 
        If specified the computer parameter becomes optional. This is the computer to connect
        to with this credential (using CredSSP authentication)
 
    .Parameter Computer
         This is the computer to connect to if Credntial is specified (using CredSSP authentication)
         Defaults to localhost
 
    .Example
        # run a simple query
 
        $connectionString = ""
        $parameters = @{}
        Invoke-SqlQuery -query "SELECT GroupID, GroupName From [dbo].[Group] WHERE GroupName=@GroupName" -parameters @{"@GroupName"="genmills\groupName"} -connectionString $connectionString;
        Invoke-SqlQuery -query "SELECT GroupID, GroupName From [dbo].[Group]" -parameters @{} -connectionString $connectionString;
#>

function Invoke-SqlQuery
{
    Param(
        [Parameter(
                Mandatory = $True
        )]
        [string]
        $Query, 
        
        [Parameter(
                Mandatory = $False
        )]
        [System.Collections.Hashtable]
        $Parameters, 

        [Parameter(
                Mandatory = $True
        )]
        [string]
        $ConnectionString, 

        [Parameter(
                Mandatory = $False
        )]
        [int]
        $Timeout = 60,

        [Parameter(
                Mandatory = $False,
                ParameterSetName = 'Credential'
        )]
        [pscredential]
        $Credential = $Null,

        [Parameter(
                Mandatory = $False,
                ParameterSetName = 'Credential'
        )]
        [string]
        $Computer = 'localhost'
    )
    
    Write-Debug -Message "`$query [$query]"
    Write-Debug -Message "`$connectionString [$connectionString]"
    Write-Debug -Message "`$timeout [$timeout]"
    $ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop
    if($Credential)
    {
        $Result = Invoke-Command -ComputerName $Computer -Credential $Credential -Authentication Credssp -ScriptBlock {
            $parameters = $Using:Parameters
            $connectionString = $Using:connectionString
            $query = $Using:query
            $timeout = $Using:timeout
            try
            {
                foreach($paramKey in $parameters.Keys)
                {
                    Write-Debug -Message "`$paramKey [$paramKey]"
                    Write-Debug -Message "`$ParamValue [$($parameters[$paramKey])]"
                }
                $sqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection `
                                            -ArgumentList $connectionString
                $sqlConnection.Open()

                #Create a command object
                $sqlCommand = $sqlConnection.CreateCommand()
                $sqlCommand.CommandText = $query
                if($parameters)
                {
                    foreach($key in $parameters.Keys)
                    {
                        $null = $sqlCommand.Parameters.AddWithValue($key, $parameters[$key])
                    }
                }
                $sqlCommand.CommandTimeout = $timeout

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

                $Datatable = New-Object -TypeName System.Data.DataTable
                $Datatable.Load($sqlReader)
            }
            Finally
            {
                if($sqlConnection -and $sqlConnection.State -ne [System.Data.ConnectionState]::Closed)
                {
                    $sqlConnection.Close()
                }
            }
            return $Datatable -as [System.Data.DataTable]
        }
        $Result
    }
    else
    {
        try
        {
            foreach($paramKey in $parameters.Keys)
            {
                Write-Debug -Message "`$paramKey [$paramKey]"
                Write-Debug -Message "`$ParamValue [$($parameters[$paramKey])]"
            }
            $sqlConnection = New-Object -TypeName System.Data.SqlClient.SqlConnection `
                                        -ArgumentList $connectionString
            $sqlConnection.Open()

            #Create a command object
            $sqlCommand = $sqlConnection.CreateCommand()
            $sqlCommand.CommandText = $query
            if($parameters)
            {
                foreach($key in $parameters.Keys)
                {
                    $null = $sqlCommand.Parameters.AddWithValue($key, $parameters[$key])
                }
            }

            $sqlCommand.CommandTimeout = $timeout

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

            $Datatable = New-Object -TypeName System.Data.DataTable
            $Datatable.Load($sqlReader)
        }
        Finally
        {
            if($sqlConnection -and $sqlConnection.State -ne [System.Data.ConnectionState]::Closed)
            {
                $sqlConnection.Close()
            }
        }
        return $Datatable
    }
}
Export-ModuleMember -Function * -Verbose:$False