API ODBC32 et ODBCBCP
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Bonjour,

Je cherche à exporter les données d'une table SQL via l'utilitaire BCP. Pour des raisons de sécurité, les utilisateurs de l'application n'ont pas le droit d'ouvrir un invite de commande (donc pas de lanceappli).

La solution trouvée est de simuler l'utilitaire BCP en exécutant l'ensemble des fonctions des DLLs utilisées ODBC32 et ODBCBCP.

Mon soucis vient lors de la création du handle de connexion SQL. Après avoir définit le handle d'environnement:

Retcode = API("ODBC32","SQLAllocHandle",SQL_HANDLE_ENV,SQL_NULL_HANDLE,&Henv)

Je dois définir une variable d'environnement:

Retcode = API("ODBC32","SQLSetEnvAttr",Henv,SQL_ATTR_ODBC_VERSION,&SQL_OV_ODBC3,0)

Le soucis est que le code de retour de cette fonction me donne la valeur SQL_INVALID_HANDLE qui indique que le handle utilisé est invalide. Or la précédente fonction me donne un résultat positif pour la création du Handle.
Le seul point qui pourrait poser problème est le passage de valeur par pointeur.

Question :

Comment peut-on passer des pointeurs dans WinDev ?

Merci de votre aide.

Cordialement,
Nicolas.

Contribution le : 14/05/2007 15:17
Créer un fichier PDF de la contribution Imprimer


Re: API ODBC32 et ODBCBCP
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
Bonjour,

Pour passer une variable à une fonction par son adresse il faut mettre le caractère "&" devant le nom de la variable.

Dans votre cas celà devrait donner ceci :

Retcode = API("ODBC32","SQLSetEnvAttr",&Henv,SQL_ATTR_ODBC_VERSION,&SQL_OV_ODBC3,0)

P.S.: Tout dépend si Henv est déjà un pointeur ou non. Si Hdev est déjà un pointeur il ne faut pas mettre le & devant le nom de la variable.

Bon dév.,

Totof

Contribution le : 14/05/2007 16:18
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr]
Créer un fichier PDF de la contribution Imprimer


Re: API ODBC32 et ODBCBCP
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Bonjour,

Merci pour votre aide.

J'avais déjà essayé la solution que vous me proposez en essayant différentes combinaison. Le seul pointeur que je dois utiliser est sur la variable SQL_OV_ODBC3 qui est sensée être initialisé par la valeur 3 comme une constante.

Pour répondre au PS, Henv n'est donc pas un pointeur.

De plus, j'ai une nouvelle information. En affichant le message d'erreur via la fonction ErreurInfo, j'obtiens le message suivant :

Dépassement de capacité lors de l'affectation. Le code erreur correspondant est 1026.

Ce message est difficile à comprendre du fait que j'utilise une DLL système32. Je continue à chercher d'où peut provenir le problème.

Cordialement,
Nicolas.

Contribution le : 14/05/2007 16:41
Créer un fichier PDF de la contribution Imprimer


Re: API ODBC32 et ODBCBCP
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
Bonjour,

Si &SQL_OV_ODBC3 est une constante il ne faut pas mettre de & devant cette variable.

Bon dév.,

Totof

Contribution le : 14/05/2007 16:43
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr]
Créer un fichier PDF de la contribution Imprimer


Re: API ODBC32 et ODBCBCP
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Bonjour,

Justement, c'est cette ambiguïté qui me gène. Pour plus d'info sur la fonction que je veux employer voici un lien sur un site la définissant :

http://www.freepascal.org/docs-html/packages/odbcsql/sqlsetenvattr.html

En parcourant un peu plus le site, il y a toutes les valeurs de constantes et la définition des types.

Cordialement,
Nicolas.

Contribution le : 14/05/2007 16:49
Créer un fichier PDF de la contribution Imprimer


Re: API ODBC32 et ODBCBCP
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
Bonjour,

Henv est un entier sur 4 octets
SQL_OV_ODBC3 est un entier sur 4 octets = 3

//---
//Puis
//---

//*** A prioris il ne faut pas mettre de & devant Henv ***//
Retcode = API("ODBC32","SQLAllocHandle",SQL_HANDLE_ENV,SQL_NULL_HANDLE,Henv)

//--
//Puis
//--

//*** Exécution de SQLSetEnvAttr ***//
Retcode = API("ODBC32","SQLSetEnvAttr",Henv,SQL_ATTR_ODBC_VERSION,&SQL_OV_ODBC3,0)

Bon dév.,

Totof

Contribution le : 14/05/2007 17:05
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr]
Créer un fichier PDF de la contribution Imprimer


Re: API ODBC32 et ODBCBCP
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Bonjour,

La solution a été exploré sans succès, je n'arrive pas à comprendre pourquoi la DLL me sort une erreur pour un handle correctement définit.
Bizarrement, il faut faire un passage par adresse pour définir le handle sinon on a une erreur de la DLL.

Retcode = API("ODBC32","SQLAllocHandle",SQL_HANDLE_ENV,SQL_NULL_HANDLE,&Henv)

Par contre pour l'utiliser il ne faut pas passer par adressage.

Retcode = API("ODBC32","SQLSetEnvAttr",Henv ,SQL_ATTR_ODBC_VERSION,&SQL_OV_ODBC3 ,0)

Je commence à penser que le problème peut venir de la configuration de ma machine. J'ai vérifié que la DLL ODBC32 étatit bien présent dans le répertoire C:\WINDOWS\System32. De plus, j'ai vérifié que les fonctions que j'utilise existe dans la DLL.

J'ai trouvé quelques exemples d'utilisation mais dans d'autres langages. Le lien suivant donne un bon exemple :

http://www.developpez.net/forums/showthread.php?t=164967

C'est un lien vers un forum avec des soucis d'utilisation de la DLL.
Je pense que mon soucis doit venir de la version de mon driver ODBC qui ne doit pas être la bonne. Mais je ne sais pas où chercher dans mon système pour connaître cette version.

J'enverrai un poste dès que j'ai plus d'informations.

Cordialement,
Nicolas.

Contribution le : 14/05/2007 17:22
Créer un fichier PDF de la contribution Imprimer


Re: API ODBC32 et ODBCBCP
Stagiaire WDF
Inscrit:
14/05/2007 14:53
Post(s): 21
Bonjour,

Voici un exemple d'implémentation de code mais en C++.

#include <stdio.h>
#include "ntodbc.h"

int main(int argc, char* argv[])
{
SQLHENV env;
SQLHDBC dbc;
SQLRETURN retcode;

retcode = SQLAllocHandle( SQL_HANDLE_ENV,
SQL_NULL_HANDLE,
&env );
if (retcode == SQL_SUCCESS
|| retcode == SQL_SUCCESS_WITH_INFO) {
printf( "env allocated\n" );
/* Set the ODBC version environment attribute */
retcode = SQLSetEnvAttr( env,
SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3, 0);
retcode = SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc );
if (retcode == SQL_SUCCESS
|| retcode == SQL_SUCCESS_WITH_INFO) {
printf( "dbc allocated\n" );
retcode = SQLConnect( dbc,
(SQLCHAR*) "ASA 9.0 Sample", SQL_NTS,
(SQLCHAR* ) "DBA", SQL_NTS,
(SQLCHAR*) "SQL", SQL_NTS );
if (retcode == SQL_SUCCESS
|| retcode == SQL_SUCCESS_WITH_INFO) {
printf( "Successfully connected\n" );
}
SQLDisconnect( dbc );
}
SQLFreeHandle( SQL_HANDLE_DBC, dbc );
}
SQLFreeHandle( SQL_HANDLE_ENV, env );
return 0;
}

Peut-être que cette exemple amènera plus de précision quand à ce que je désire faire.

Cordialement,
Nicolas.

Contribution le : 14/05/2007 17:39

Edité par Madinico sur 14/5/2007 17:59:49
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2