- PVSM.RU - https://www.pvsm.ru -

ODBC Firebird Postgresql, выполнение запросов в Powershell

Иногда у системных инженеров возникает необходимость получить определенный набор данных непосредственно из самой СУБД средствами Powershell. В данной статье хочу продемонстрировать два метода работы c firebird, postgresql через odbc драйвер и клиентскую библиотеку.
Начнем с firebird и работу с базой через ODBC драйвер, для начала нужно зарегистрировать в системе клиентскую библиотеку GDS32.DLL, ее разрядность должна быть такой же как и ODBC драйвера который должен быть установлен далее, скачать можно на сайте производителя [1], обязательно во время установки необходимо поставить галочку о регистрации библиотеки.

image

Далее устанавливаем сам ODBC, который также берем на сайте производителя [2], не забываем что его разрядность должна соответствовать разрядности ранее установленного клиента. Теперь собственно сам powershell скрипт, за его основу был взят пример на C# для postgresql. [3]

$dbServerName = "localhost:base.gdb"
$dbUser = "SYSDBA"
$dbPass = "masterkey"

[string]$szConnect  = "Driver={Firebird/InterBase(r) driver};Dbname=$dbServerName;Pwd=$dbPass;CHARSET=WIN1251;UID=$dbUser" 

$cnDB = New-Object System.Data.Odbc.OdbcConnection($szConnect)
$dsDB = New-Object System.Data.DataSet
try
{
    $cnDB.Open() 
    $adDB = New-Object System.Data.Odbc.OdbcDataAdapter 
    $adDB.SelectCommand = New-Object System.Data.Odbc.OdbcCommand("Select * From users", $cnDB) 
    $adDB.Fill($dsDB)     
    $cnDB.Close() 
}
catch [System.Data.Odbc.OdbcException]
{
    $_.Exception
    $_.Exception.Message
    $_.Exception.ItemName
}

foreach ($row in $dsDB[0].Tables[0].Rows)
{
    $row
}

Логика работы с базой:

  • Открываем подключение к базе.
  • Создаем Data Adapter, которые используются для заполнения DataSet.
  • Заполняем свойство SelectCommand (Возвращает или задает инструкцию SQL или хранимую процедуру, используемую для выбора записей в источнике данных.), для этого создаем новый объект OdbcCommand и его конструктору передаем в виде строки наш запрос, также передаем ссылку на объект нашего открытого подключения.
  • Заполняем наш DataSet полученным результатом выполненного запроса.
  • Закрываем подключение к базе.

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

Теперь рассмотрим способ с использованием клиентской библиотеки, он не требует установки ODBC драйвера и регистрации клиентской библиотеки в системе. Скрипт основан на примерах [4] для C#, доступны на сайте производителя.

function SelestFireBirdDB ($string)
{
    [Reflection.Assembly]::LoadFile("C:filesdllFirebirdSql.Data.FirebirdClient.dll")
    $TestLog = "D:tmpTestLog.txt"

    #Строка подключения
    $connectionString =  "User=SYSDBA;Password=masterkey;Database=base.gdb;DataSource=localhost;Dialect=1;Pooling=true;MaxPoolSize=3;Connection Lifetime=60"

    $connection= New-Object FirebirdSql.Data.FirebirdClient.FbConnection($connectionString)
        try
            {
                $connection.Open()
            }
        catch 
            {
                $_.Exception
                $_.Exception.Message
                $_.Exception.ItemName
            }

    #Транзакция

    $Transaction = New-Object FirebirdSql.Data.FirebirdClient.FbTransactionOptions
    $BeginTransaction = $connection.BeginTransaction($Transaction)

    #Создаем запрос    

    $Command= New-Object FirebirdSql.Data.FirebirdClient.FbCommand($string,$connection,$BeginTransaction)
    $Command.Parameters.Clear
    $Command.Parameters.AddWithValue("Speed", 100)

    #Создаем адаптер данных

    $FbDataAdapter= New-Object FirebirdSql.Data.FirebirdClient.FbDataAdapter($Command)
    $FbDataAdapter
    $DataSet= New-Object System.Data.DataSet

        try
            {

                $FbDataAdapter.Fill($DataSet)
                $Selest= $DataSet.Tables[0]
            }
        catch
            {
                $_.Exception
                $_.Exception.Message
                $_.Exception.ItemName
            }
        finally
            {
                $BeginTransaction.Rollback()
                $connection.Close()
            }

            return ,$Selest
}

Завершаю статью примером для postgresql, с использованием ODBC драйвера. Сначала необходимо его [5] установить, я использовал упакованный в msi пакет, поскольку его удобно распространять средствами SCCM. Собственно сам скрипт, он отличается от firebird только строкой подключения, в которой меняется название драйвера. В windows 10 и windows server 2016 появился командлет, который покажет список зарегистрированных ODBC драйверов Get-OdbcDrive.

$dbServer = "192.168.0.10" 
$dbName = "core"
$dbUser = "postgres"
$dbPass = "postgres"
$port = "5432"

[string]$szConnect  = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=$port;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;" 

$cnDB = New-Object System.Data.Odbc.OdbcConnection($szConnect)
$dsDB = New-Object System.Data.DataSet
try
{
    $cnDB.Open()
    $adDB = New-Object System.Data.Odbc.OdbcDataAdapter    
    $adDB.SelectCommand = New-Object System.Data.Odbc.OdbcCommand("SELECT id, name, age, login FROM public.users" , $cnDB) 
    $adDB.Fill($dsDB) 
    $cnDB.Close() 
}
catch [System.Data.Odbc.OdbcException]
{
    $_.Exception
    $_.Exception.Message
    $_.Exception.ItemName
}

foreach ($row in $dsDB[0].Tables[0].Rows)
{
    $row.login
    $row.age
}

Надеюсь данная статья будет полезной, спасибо за внимание.

Автор: Didenko_G

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/powershell/202604

Ссылки в тексте:

[1] скачать можно на сайте производителя: http://firebirdsql.org/en/firebird-2-5-1/

[2] который также берем на сайте производителя: http://firebirdsql.org/en/odbc-driver/

[3] пример на C# для postgresql.: https://odbc.postgresql.org/howto-csharp.html

[4] примерах: http://firebirdsql.org/en/net-examples-of-use/

[5] его: https://www.postgresql.org/ftp/odbc/versions/

[6] Источник: https://habrahabr.ru/post/313464/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best