HFSQL et Powershell
[cyklodev_summary]
On n’a pas de toujours MariaDB, Mysql ou Oracle sous la main, et des fois il faut gérer des bases plus … comment dire … exotiques !
J’ai rrécemment croisé HFSQL qui provient du même pot que Windev. Et pour communiquer avec, sans Windev , les options sont restreintes.
ODBC : L’ancêtre (1992)
ODBC est un middleware qui s’occupe de faire l’abstraction entre du code et une source de données de type structuré (Mysql, MS sql, Oracle, Informix,Access,…)
Installation
On va recuperer le driver ici : https://www.pcsoft.fr/st/telec/modules-communs-23/wx23_42u.htm
Vérification
En powershell on va vérifier l’installation
PS C:\Users\Zeph> Get-OdbcDriver | Where-Object Name -like « HFSQL »
Name : HFSQL
Platform : 32-bit
Attribute : {ApiLevel, DriverODBCVer, FileUsage, Driver…}
Name : HFSQL
Platform : 64-bit
Attribute : {ApiLevel, DriverODBCVer, FileUsage, Driver…}
Requête
Toujours en powershell on va requêter un table
$cServer="localhost"
$cPort="4901"
$cDB="hfDB"
$cUser="hfUSer"
$cPass="hfPass"
$connectstring = "DRIVER={HFSQL};Server Name=$cServer;Server Port=$cPort;Database=$cDB;UID=$cUser;PWD=$cPAss"
$sql = @'
SELECT * FROM hfTAble
'@
$conn = New-Object System.Data.Odbc.OdbcConnection($connectstring)
$conn.open()
$cmd = New-Object system.Data.Odbc.OdbcCommand($sql,$conn)
$da = New-Object system.Data.Odbc.OdbcDataAdapter($cmd)
$dt = New-Object system.Data.datatable
$null = $da.fill($dt)
$conn.close()
$dt
Rien de bien compliqué ici.
Le type memotexte
Tout se corse quand vous allez vouloir requêter des champs de type memotexte.
Code erreur : 28000002
Niveau : erreur fatale (EL_FATAL)
+ $null = $da.fill($dt)
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : OdbcException
Je n’avais jamais entendu parler ce type, mais il s’agit en fait d’un champ de type BLOB.
Du coup, une résolution peut être un cast sql en varchar pour s’affranchir de cette erreur.
SELECT CAST(MEMOTEXT as varchar(4096)) FROM hfTAble
Mais il y a mieux :)
OLEDB: Le senior (1996)
OLE DB est le successeur d’ODBC et apporte des améliorations dans le type de source de données gérés, comme les fichiers excel ou encore les fichiers xml.
Installation
Comme avant, on va recuperer le driver ici : https://www.pcsoft.fr/st/telec/modules-communs-23/wx23_42u.htm
Vérification
Toujours en powershell, on liste les providers OLE DB
foreach ($provider in [System.Data.OleDb.OleDbEnumerator]::GetRootEnumerator())
{
$v = New-Object PSObject
for ($i = 0; $i -lt $provider.FieldCount; $i++)
{
Add-Member -in $v NoteProperty $provider.GetName($i) $provider.GetValue($i)
}
$v | Where-Object -Property SOURCES_NAME -like "*HFSQL*"
}
SOURCES_NAME : PCSoft.HFSQL
SOURCES_DESCRIPTION : PC SOFT OLE DB Provider for HFSQL
SOURCES_TYPE : 1
SOURCES_ISPARENT : False
Requête
On va maintenant faire la même requête qu’avec ODBC.
function LoadDataTable ($ConnString, $SqlQuery)
{
$OLEDBConn = New-Object System.Data.OleDb.OleDbConnection($ConnString)
$OLEDBConn.open()
$readcmd = New-Object system.Data.OleDb.OleDbCommand($SqlQuery,$OLEDBConn)
$readcmd.CommandTimeout = '300'
$da = New-Object system.Data.OleDb.OleDbDataAdapter($readcmd)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)
$OLEDBConn.close()
return ,$dt
}
$cServer="localhost"
$cPort="4901"
$cDB="hfDB"
$cUser="hfUSer"
$cPass="hfPass"
$cs = "Provider=PCSOFT.HFSQL;Data Source=$cServer`:$cPort;User ID=$cUser;Password=$cPass;Initial Catalog=$cDB"
SELECT * FROM hfTAble
$rez = LoadDataTable $cs $sql
echo $rez
Avec OLE DB, c’est magique plus besoin de caster les champs de type memotexte !
En plus de régler les problèmes de CAST, OLE DB règle aussi des soucis de détection des schémas. Par contre niveau performance, l’un comme l’autre ne sont pas au niveau d’un connecteur natif.