HFSQL et Powershell



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 récemment croiser 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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *