sqldataadapter не работает в powershell - PullRequest
0 голосов
/ 06 января 2020

пожалуйста, найдите код, который выдает запрос на выборку к базе данных. Я загружаю вывод в таблицу, которая не работает. Запрос на выбор в порядке, поскольку я выполняю тот же запрос в базе данных и получаю 1 строку в качестве вывода.

$SqlQuery = "select InputFiles,OutputFiles from $mastTableNm where JobName = '$jobname'"; 

                $sqloutqryreader = MsSqlQueryExecutor $SqlQuery $logfile 'SELECT'

                Add-Content -Value "$TimeinSec Log: Reading data from sql reader" -Path $logfile    

                $mstrtab = new-object System.Data.DataTable 
                $mstrtab.Load($sqloutqryreader) 
                echo $mstrtab

                ForEach($mstrjobrw in $mstrtab) 
                {
                    Add-Content -Value "$TimeinSec Log: Reading data from sql reader $mstrjobrw.InputFiles $mstrjobrw.OutputFiles " -Path $logfile                                      
                }

Ниже приведена функция, которая выполняет запрос и возвращает адаптер.

function Global:MsSqlQueryExecutor(
                        $SqlQuery,
                        $logfile,
                        $QueryType
                        )
    {   
        $Global:sqloutput = $Null
            try
                {
                  # make sure that the output from the following code block does not pollute return value                           
                  $Null = @(    
                        Add-Content -Value "$TimeinSec Log: Setting up the sql query to execute" -Path $logfile

                        $SQLUsername = "aa"
                        $SQLPassword = "aa"
                        $Database = "aa"
                        $SQLServer = "aa.aa.aa.windows.net"

                        # Define the connection to the SQL Database 
                        $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
                        $SqlConnection.ConnectionString = "Server=$SQLServer;Database=$Database;User ID=$SQLUsername;Password=$SQLPassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=5000;"             

                        $SqlCmd = New-Object System.Data.SqlClient.SqlCommand                           

                        $SqlCmd.CommandText = $SqlQuery
                        $SqlCmd.Connection = $SqlConnection
                        $SqlCmd.CommandType = [System.Data.CommandType]::Text
                        $SqlCmd.CommandTimeout = 0                      

                        Add-Content -Value "$TimeinSec Log: Preparation to execute query: $SqlQuery is completed" -Path $logfile

                        if ($SqlConnection.State -eq [System.Data.ConnectionState]'Closed') 
                            {
                                $SqlConnection.Open()
                            }

                        if ($QueryType -eq 'SELECT')
                        {
                            $adp = New-Object System.Data.SqlClient.SqlDataAdapter $SqlCmd
                            $dtst = New-Object System.Data.DataSet
                            $adp.Fill($dtst)
                            $Global:sqloutput = $dtst.Tables[0]
                            Add-Content -Value "$TimeinSec Log: Execution of the $QueryType query: $SqlQuery completed successfully." -Path $logfile
                        }
                        else
                        {
                            $Global:sqloutput = $SqlCmd.ExecuteReader()
                            Add-Content -Value "$TimeinSec Log: Execution of the $QueryType query: $SqlQuery completed successfully." -Path $logfile
                        }

                    )
                 return $Global:sqloutput   
                }
            catch
                {               
                    Add-Content -Value "$TimeinSec Error: Failed to Query: $SqlQuery" -Path $logfile
                    Add-Content -Value $_.Exception.Message -Path $logfile
                    EXIT                    
                }   
            finally
                {
                    $SqlConnection.Close()
                    $SqlConnection.Dispose();
                    Add-Content -Value "$TimeinSec Cleanup: Connection is disposed" -Path $logfile  
                }

    }

Таблица не загружается.

Я попробовал другой обходной путь, который также не работает.

Пожалуйста, найдите ссылку на этот вопрос

Метод read () внутри sqldatareader в powershell не работает, пока l oop

Ответы [ 2 ]

1 голос
/ 07 января 2020

Можете ли вы сначала попробовать простой фрагмент кода с помощью ExecuteReader () для заполнения таблицы данных? Посмотрите, возвращает ли запрос basi c какие-либо данные или нет,

$jobname = "<jobname>"
$mastTableNm = "<tablename>"
$sqlConn = New-Object System.Data.SqlClient.sqlConnection "<Your Connection String Here>";
$sqlConn.Open();
$sqlCommand = $sqlConn.CreateCommand();
$sqlCommand.CommandText = "select InputFiles,OutputFiles from $mastTableNm where JobName = '$jobname'";
Write-Host $sqlCommand.CommandText;
$result = $sqlCommand.ExecuteReader();
$dtTable = New-Object System.Data.DataTable;
$dtTable.Load($result);
0 голосов
/ 08 января 2020

Проблема была с возвратом. Powershell имеет несколько раздражающее поведение при возврате. Я использовал обходной путь, чтобы мой код работал. вместо возврата я использовал глобальную переменную для инициализации таблицы данных. Эта глобальная переменная была затем доступна в коде, где мне нужно.

function Global:MsSqlQueryExecutor(
                        $SqlQuery,
                        $logfile,
                        $QueryType
                        )
    {   
            try
                {
                  # make sure that the output from the following code block does not pollute return value                           
                  $Null = @(    
                        Add-Content -Value "$TimeinSec Log: Setting up the sql query to execute" -Path $logfile

                        $SQLUsername = "aaa"
                        $SQLPassword = "aaa"
                        $Database = "aaa"
                        $SQLServer = "aaat"

                        # Define the connection to the SQL Database 
                        $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
                        $SqlConnection.ConnectionString = "Server=$SQLServer;Database=$Database;User ID=$SQLUsername;Password=$SQLPassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=5000;"             

                        $SqlCmd = New-Object System.Data.SqlClient.SqlCommand                           

                        $SqlCmd.CommandText = $SqlQuery
                        $SqlCmd.Connection = $SqlConnection
                        $SqlCmd.CommandType = [System.Data.CommandType]::Text
                        $SqlCmd.CommandTimeout = 0                      

                        Add-Content -Value "$TimeinSec Log: Preparation to execute query: $SqlQuery is completed" -Path $logfile

                        if ($SqlConnection.State -eq [System.Data.ConnectionState]'Closed') 
                            {
                                $SqlConnection.Open()
                            }

                        if ($QueryType -eq 'SELECT')
                        {
                            $adp = New-Object System.Data.SqlClient.SqlDataAdapter $SqlCmd
                            $dtst = New-Object System.Data.DataSet
                            $adp.Fill($dtst)
                            $Global:sqlexecoutput = $dtst.Tables[0]
                            Add-Content -Value "$TimeinSec Log: Execution of the $QueryType query: $SqlQuery completed successfully." -Path $logfile
                        }
                        else
                        {
                            $Global:sqlexecoutput = $SqlCmd.ExecuteReader()
                            Add-Content -Value "$TimeinSec Log: Execution of the $QueryType query: $SqlQuery completed successfully." -Path $logfile
                        }

                    )                
                }
            catch
                {               
                    Add-Content -Value "$TimeinSec Error: Failed to Query: $SqlQuery" -Path $logfile
                    Add-Content -Value $_.Exception.Message -Path $logfile
                    EXIT                    
                }   
            finally
                {
                    $SqlConnection.Close()
                    $SqlConnection.Dispose();
                    Add-Content -Value "$TimeinSec Cleanup: Connection is disposed" -Path $logfile  
                }

    }
...