Функция для работы с MySQL
13 Январь 2010
Начнем с MySQL. С ним оказалось не все так просто. Для работы с ним необходимо на компьютер где будет работать функция/скрипт установить Connector/Net от MySQL соответствующий версии вашего сервера. Прочитав доку в общем получается одна функция для select/inserd/delete/update.
Function Connect-ToMySQL {
param([String]$query,[String]$database,[String]$hostmysql,[String]$login,[String]$password)
#--- загрудаем компоненты mysql
[void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
#--- открываем подключение
$connStr = "server=$hostmysql;port=3306;uid=$login;pwd=$password;database=$database;Pooling=False"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()
#--- создаем объекты для выполнения запроса
$cmd = New-Object MySql.Data.MySqlClient.MySqlCommand($query, $conn)
$da = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($cmd)
$ds = New-Object System.Data.DataSet
#--- получение запроса
$da.Fill($ds) | Out-Null
#--- ну и вывод на экран
$ds.Tables[0]
#--- закрываем подключени
$conn.close()
}
param([String]$query,[String]$database,[String]$hostmysql,[String]$login,[String]$password)
#--- загрудаем компоненты mysql
[void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
#--- открываем подключение
$connStr = "server=$hostmysql;port=3306;uid=$login;pwd=$password;database=$database;Pooling=False"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()
#--- создаем объекты для выполнения запроса
$cmd = New-Object MySql.Data.MySqlClient.MySqlCommand($query, $conn)
$da = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($cmd)
$ds = New-Object System.Data.DataSet
#--- получение запроса
$da.Fill($ds) | Out-Null
#--- ну и вывод на экран
$ds.Tables[0]
#--- закрываем подключени
$conn.close()
}
В итоге получаем вот такой результат:
[PS] <16> C:\Bin>$inquiry = 'SELECT `domain-id`,username,active FROM users WHERE username="abigor@isea.ru"'
[PS] <17> C:\Bin>Connect-ToMySQL -database 'mail-server' -login 'usertest' -password 'pass' -hostmysql 'sqlsrv' -query $inquiry
domain-id username active
--------- -------- ------
1 abigor@isea.ru true
[PS] <18> C:\Bin>
[PS] <18> C:\Bin>$inquiry = 'update users set active="false" WHERE username="abigor@isea.ru"'
[PS] <19> C:\Bin>Connect-ToMySQL -database 'mail-server' -login 'usertest' -password 'pass' -hostmysql 'sqlsrv' -query $inquiry
[PS] <20> C:\Bin>$inquiry = 'SELECT `domain-id`,username,active FROM users WHERE username="abigor@isea.ru"'
[PS] <21> C:\Bin>Connect-ToMySQL -database 'mail-server' -login 'usertest' -password 'pass' -hostmysql 'sqlsrv' -query $inquiry
domain-id username active
--------- -------- ------
1 abigor@isea.ru false
[PS] <22> C:\Bin>
[PS] <17> C:\Bin>Connect-ToMySQL -database 'mail-server' -login 'usertest' -password 'pass' -hostmysql 'sqlsrv' -query $inquiry
domain-id username active
--------- -------- ------
1 abigor@isea.ru true
[PS] <18> C:\Bin>
[PS] <18> C:\Bin>$inquiry = 'update users set active="false" WHERE username="abigor@isea.ru"'
[PS] <19> C:\Bin>Connect-ToMySQL -database 'mail-server' -login 'usertest' -password 'pass' -hostmysql 'sqlsrv' -query $inquiry
[PS] <20> C:\Bin>$inquiry = 'SELECT `domain-id`,username,active FROM users WHERE username="abigor@isea.ru"'
[PS] <21> C:\Bin>Connect-ToMySQL -database 'mail-server' -login 'usertest' -password 'pass' -hostmysql 'sqlsrv' -query $inquiry
domain-id username active
--------- -------- ------
1 abigor@isea.ru false
[PS] <22> C:\Bin>
Все бы хорошо. но есть одна проблема. Если у вас запрос в стоит в апострофе, то экранировать имена полей с дефисом надо одинарными обратным апострофом
`domain-id`
. Если же в запрос взят в кавычки, то экранировать надо двумя обратными апострофами
``domain-id``
. Понятно почему так получается. Из-за того, что все кавычки позволяют раскрыть содержимое, а все что в апострофах воспринимается как текст.

.gif)
