ODBC Firebird Postgresql, виконання запитів в Powershell

Іноді у системних інженерів виникає необхідність отримати певний набір даних безпосередньо з самої СУБД засобами Powershell. У даній статті хочу продемонструвати два методи роботи з firebird, postgresql через odbc драйвер і клієнтську бібліотеку.
Почнемо з firebird і роботу з базою через ODBC драйвер для початку потрібно зареєструвати в системі клієнтську бібліотеку GDS32.DLL її розрядність повинна бути такою ж як і ODBC драйвера який повинен бути встановлений далі, скачати можна на сайті виробника, обов'язково під час установки необхідно поставити галочку про реєстрацію бібліотеки.
image
Далі встановлюємо сам ODBC, який також беремо на сайті виробника, не забуваємо що його розрядність повинна відповідати розрядності раніше встановленого клієнта. Тепер власне сам powershell скрипт, за його основу був узятий приклад на C# для postgresql.

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

[string]$szConnect = "Driver={Firebird/InterBase® 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.Ім'я елемента
}

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

Логіка роботи з базою:
  • Відкриваємо підключення до бази.
  • Створюємо Data Adapter, які використовуються для заповнення DataSet.
  • Заповнюємо властивість SelectCommand (Повертає або встановлює інструкцію SQL або збережену процедуру, яка використовується для вибору записів у джерелі даних.), для цього створюємо новий об'єкт OdbcCommand і його конструктору передаємо у вигляді рядка наш запит, також передаємо посилання на об'єкт нашого відкритого підключення.
  • Заповнюємо наш DataSet отриманим результатом виконаного запиту.
  • Закриваємо підключення до бази.
В кінці скрипта звичайним циклом foreach, йде перебір отриманих даних, тут можливо дописати власну логіку, приміром створити поштову скриньку згідно логіна, або додати користувача в певну групу.
Тепер розглянемо спосіб з використанням клієнтської бібліотеки, він не вимагає установки ODBC драйвера і реєстрації клієнтської бібліотеки в системі. Сценарій заснований на прикладах C#, доступні на сайті виробника.
function SelestFireBirdDB ($string)
{
[Reflection.Assembly]::LoadFile("C:\files\dll\FirebirdSql.Data.FirebirdClient.dll")
$TestLog = "D:\tmp\TestLog.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.Ім'я елемента
}

#Транзакція

$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.Ім'я елемента
}
finally
{
$BeginTransaction.Rollback()
$connection.Close()
}

return ,$Selest
}

Завершую статтю прикладом для postgresql, з використанням ODBC драйвера. Спочатку необхідно установити, я використовував упакований в 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.Ім'я елемента
}

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

Надіюсь дана стаття буде корисною, дякую за увагу.
<habracut/>
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.