I. Configuration du driver ODBC Sybase▲
Après avoir installé le client Sybase, vous devriez obtenir, dans la liste des drivers, le driver ODBC de Sybase :
Configurez une nouvelle source de données avec le driver Sybase et entrez les paramètres demandés selon la configuration de votre serveur Sybase :
Testez vos paramètres en vous connectant au serveur :
Si vous obtenez cette erreur :
Retournez dans les paramètres du driver, onglet « Advanced », entrez « us_english » pour la langue, validez et retestez la connexion :
Voilà notre source de données ODBC « SybaseTS » configurée :
II. Exemples de code avec 4D ODBC Pro (4D 2004 et 4D v11 SQL)▲
Nous pouvons maintenant nous connecter et manipuler les données d'un serveur Sybase en utilisant le plugin 4D ODBC Pro.
Les plugins 4D sous forme de bundle (« plugin.bundle ») sont à placer dans le dossier « Plugins » soit à côté de la structure de la base de données, soit à côté de l'application 4D.
Ci-dessous, une suite de codes exemples simples pour différentes requêtes SQL vers le serveur Sybase.
II-1. SELECT▲
init_variables `méthode d'initialisation des variables
`connexion
C_LONGINT($connectionID)
$result:=ODBC_SQLAllocConnect ($connectionID)
$result:=ODBC_SQLConnect ($connectionID;"SybaseTS";"sa";"")
If ($result=SQL_SUCCESS ) `Connexion OK
` allocation
$result:=ODBC_SQLAllocStmt ($connectionID;$statementID)
` préparation de la requête
$sql_statement:="select peopleid, peoplename, peopledatecrea from people"
$result:=ODBC_SQLPrepare ($statementID;$sql_statement)
` binding avec les colonnes de la table
ARRAY LONGINT(ZeID;0)
ARRAY TEXT(ZeName;0)
ARRAY DATE(zeDate;0)
$result:=ODBC_SQLBindCol ($statementID;1;->ZeID;->zeLength)
$result:=ODBC_SQLBindCol ($statementID;2;->ZeName;->zeLength)
$result:=ODBC_SQLBindCol ($statementID;3;->zeDate;->zeLength)
` exécution
$result:=ODBC_SQLExecute ($statementID)
` récupération des données dans les deux tableaux
While ($result#SQL_NO_DATA )
$result:=ODBC_SQLFetch ($statementID)
End while
`libération du curseur
$result:=ODBC_SQLFreeStmt ($statementID;SQL_UNBIND )
Else
ALERT("Pas de connexion... !")
End if
`déconnexion
$result:=ODBC_SQLDisconnect ($connectionID)II-2. INSERT▲
init_variables `méthode d'initialisation des variables
`connexion
C_LONGINT($connectionID)
$result:=ODBC_SQLAllocConnect ($connectionID)
$result:=ODBC_SQLConnect ($connectionID;"SybaseTS";"sa";"")
If ($result=SQL_SUCCESS ) `Connexion OK
` allocation
$result:=ODBC_SQLAllocStmt ($connectionID;$statementID)
` on va créer 50 enregistrements dans la table people de Sybase, avec la date du jour
For ($i;1;50)
` préparation de la requête
$sql_statement:="insert into people (peopleid, peoplename, peopledatecrea) "
$sql_statement:=$sql_statement+"values ("+String($i)+",'"+"people_"+String($i)+"',getdate())"
$result:=ODBC_SQLPrepare ($statementID;$sql_statement)
` exécution
$result:=ODBC_SQLExecute ($statementID)
` libération du curseur
$result:=ODBC_SQLFreeStmt ($statementID;SQL_UNBIND )
End for
Else
ALERT("Pas de connexion... !")
End if
` déconnexion
$result:=ODBC_SQLDisconnect ($connectionID)II-3. UPDATE▲
init_variables `méthode d'initialisation des variables
`connexion
C_LONGINT($connectionID)
$result:=ODBC_SQLAllocConnect ($connectionID)
$result:=ODBC_SQLConnect ($connectionID;"SybaseTS";"sa";"")
If ($result=SQL_SUCCESS ) `Connexion OK
` allocation
$result:=ODBC_SQLAllocStmt ($connectionID;$statementID)
` mise à jour des colonnes 'job' et 'techno' pour tous les enregistrements de la table 'people'
` préparation de la requête
$sql_statement:="update people set job = 1, techno = 1"
$result:=ODBC_SQLPrepare ($statementID;$sql_statement)
` exécution
$result:=ODBC_SQLExecute ($statementID)
` libération du curseur
$result:=ODBC_SQLFreeStmt ($statementID;SQL_UNBIND )
Else
ALERT("Pas de connexion... !")
End if
` déconnexion
$result:=ODBC_SQLDisconnect ($connectionID)II-4. DELETE▲
init_variables `méthode d'initialisation des variables
`connexion
C_LONGINT($connectionID)
$result:=ODBC_SQLAllocConnect ($connectionID)
$result:=ODBC_SQLConnect ($connectionID;"SybaseTS";"sa";"")
If ($result=SQL_SUCCESS ) `Connexion OK
` allocation
$result:=ODBC_SQLAllocStmt ($connectionID;$statementID)
` on supprime les lignes de la table people dont le nom est 'test'
` préparation de la requête
$sql_statement:="delete people where peoplename='test'"
$result:=ODBC_SQLPrepare ($statementID;$sql_statement)
` exécution
$result:=ODBC_SQLExecute ($statementID)
` libération du curseur
$result:=ODBC_SQLFreeStmt ($statementID;SQL_UNBIND )
Else
ALERT("Pas de connexion... !")
End if
` déconnexion
$result:=ODBC_SQLDisconnect ($connectionID)II-5. EXECUTE (procédure stockée)▲
Nous allons exécuter une procédure stockée présente sur le serveur Sybase.
La procédure stockée se nomme sp_fieldtypes et voici son code :
/* retourne tous les types de colonnes de Sybase */
create procedure ps_fieldtypes
as
begin
select name, length, allownulls
from master.dbo.systypes
return 0
endExécution de la procédure Sybase sp_fieldtypes avec 4D ODBC Pro :
init_variables `méthode d'initialisation des variables
`connexion
C_LONGINT($connectionID)
$result:=ODBC_SQLAllocConnect ($connectionID)
$result:=ODBC_SQLConnect ($connectionID;"SybaseTS";"sa";"")
If ($result=SQL_SUCCESS ) `Connexion OK
$result:=ODBC_SQLAllocStmt ($connectionID;$statementID)
$sql_statement:="EXECUTE ps_fieldtypes"
$result:=ODBC_SQLPrepare ($statementID;$sql_statement)
`binding
ARRAY TEXT(ZeFTName;0)
ARRAY TEXT(ZeFTLength;0)
ARRAY BOOLEAN(ZeftAllowNulls;0)
$result:=ODBC_SQLBindCol ($statementID;1;->ZeFTName;->zeLength) `colonne name
$result:=ODBC_SQLBindCol ($statementID;2;->ZeFTLength;->zeLength) `colonne length
$result:=ODBC_SQLBindCol ($statementID;3;->ZeftAllowNulls;->zeLength) `colonne allownulls
$result:=ODBC_SQLExecute ($statementID)
While ($result#SQL_NO_DATA )
$result:=ODBC_SQLFetch ($statementID)
End while
$result:=ODBC_SQLFreeStmt ($statementID;SQL_UNBIND )
Else
ALERT("no connection!!")
End if
$result:=ODBC_SQLDisconnect ($connectionID)III. Exemples de code avec le moteur SQL de 4D v11▲
Nous pouvons maintenant nous connecter et manipuler les données d'un serveur Sybase en utilisant le moteur SQL intégré à 4D v11 SQL.
Ci-dessous, une suite de codes exemples simples pour différentes requêtes SQL vers le serveur Sybase.
Les exemples ne sont applicables que pour la version 4D v11 SQL.
III-1. SELECT▲
init_variables `méthode d'initialisation des variables
UTILISER BASE EXTERNE("SybaseTS";"sa";"") `on se connecte au serveur Sybase
Si (OK=1) `connexion OK
TABLEAU ENTIER LONG(ZeID;0) `la variable qui sera bindée
TABLEAU TEXTE(ZeName;0) `la variable qui sera bindée
Debut SQL `encapsulation requête SQL
SELECT peopleid, peoplename FROM people
INTO :ZeID, :ZeName
Fin SQL
Sinon
ALERTE("Pas de connexion !")
Fin de si
UTILISER BASE INTERNE ` déconnecte de la base externeIII-2. INSERT▲
init_variables `méthode d'initialisation des variables
UTILISER BASE EXTERNE("SybaseTS";"sa";"")
Si (OK=1) `connection OK
Debut SQL `encapsulation requête SQL
INSERT INTO people (peopleid, peoplename, peopledatecrea)
VALUES (1, 'toto', getdate())
Fin SQL
Sinon
ALERTE("Pas de connexion !")
Fin de si
UTILISER BASE INTERNE ` déconnecte de la base externeIII-3. UPDATE▲
init_variables `méthode d'initialisation des variables
UTILISER BASE EXTERNE("SybaseTS";"sa";"")
Si (OK=1) `connection OK
Debut SQL `encapsulation requête SQL
UPDATE people SET job = 1, techno = 1 WHERE peoplename='toto'
Fin SQL
Sinon
ALERTE("Pas de connexion !")
Fin de si
UTILISER BASE INTERNE ` déconnecte de la base externeIII-4. DELETE▲
init_variables `méthode d'initialisation des variables
UTILISER BASE EXTERNE("SybaseTS";"sa";"")
Si (OK=1) `connection OK
Debut SQL `encapsulation requête SQL
DELETE people WHERE peoplename='toto'
Fin SQL
Sinon
ALERTE("Pas de connexion !")
Fin de si
UTILISER BASE INTERNE ` déconnecte de la base externeIII-5. EXECUTE (procédure stockée)▲
init_variables `méthode d'initialisation des variables
UTILISER BASE EXTERNE("SybaseTS";"sa";"")
Si (OK=1) `connexion OK
TABLEAU TEXTE(ZeFTName;0) `la variable qui sera bindée
TABLEAU TEXTE(ZeFTLength;0) `la variable qui sera bindée
TABLEAU BOOLEEN(ZeftAllowNulls;0) `la variable qui sera bindée
Debut SQL `encapsulation requête SQL
EXECUTE ps_fieldtypes
INTO :ZeFTName, :ZeFTLength, :ZeftAllowNulls
Fin SQL
Sinon
ALERTE("Pas de connexion !")
Fin de si
UTILISER BASE INTERNE ` déconnecte de la base externeIV. Notes▲
Nous traiterons les manipulations d'images et de blobs avec Sybase dans un prochain article.
V. Documentation▲
Commandes et sections pour SQL (4D v11 SQL)
4D ODBC Pro (4D v11 SQL)
4D ODBC Pro (4D 2004)
Rubrique « 4D et les autres SGBDR »



