Connectivité : 4D et Sybase

Stéphanie Tirtiat

Produit : 4D 2004, 4D v11 SQL, plugin 4D ODBC Pro · Plateforme : Mac & Win ♪

- Titre : Connectivité : 4D et Sybase

- Auteur : Stéphanie Tirtiat

- Parution : 8 novembre 2007

- Licence : Copyright ® 2007 4D s.a. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Configuration du driver ODBC Sybase

- II. Exemples de code avec 4D ODBC Pro (4D 2004 et 4D v11 SQL)

- II-1. SELECT

- II-2. INSERT

- II-3. UPDATE

- II-4. DELETE

- II-5. EXECUTE (procédure stockée)

- III. Exemples de code avec le moteur SQL de 4D v11

- III-1. SELECT

- III-2. INSERT

- III-3. UPDATE

- III-4. DELETE

- III-5. EXECUTE (procédure stockée)

- IV. Notes

- V. Documentation

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 »