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
end
Exé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 externe
III-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 externe
III-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 externe
III-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 externe
III-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 externe
IV. 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 »