Connexion à Informix?

Michelk12_8898
Connexion à Informix?

Bonjour,

Je développe depuis peu avec Visual Web Developer 2005 Express et sous Windows XP.
Mon application n'a aucun soucis de fonctionnement avec une base Access mais alors vraiment de gros problème lorsque je tente d'accéder à une base Informix.

Dans le fichier Web.Config, j'ai remplacé :

<appSettings>
<add key="ConnectionString" value="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=\serveur\rep\Database.mdb;User ID=;Password=;"/>
</appSettings>

par :
<appSettings>
<add key="ConnectionString" value="Provider=Ifxoledbc; Dsn=DSN_existant; informixserver=ids_boite; User ID=informix_user; Data Source=base_boite; host=boite; Password=pass_uid;"/>
</appSettings>

Sur ma machine de dev : j'arrive à me connecter et très rapidement j'obtiens l'exeption :

{System.Data.OleDb.OleDbException: Aucune message d'erreur disponible, code de résultat : -2147417851(0x80010105).
   à System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
   à System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   à System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
   à System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   à System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   à System.Data.OleDb.OleDbConnection.Open()
   à SGBDFactory.OpenConnection() dans \tout le chemin\App_Code\Classes\Factories\SGBDFactory.cs:ligne 33
   à SGBDFactory.Select(String sql) dans \tout le chemin\App_Code\Classes\Factories\SGBDFactory.cs:ligne 159}

Je cherche sans trouver :cry:
En transférant les fichiers sur une machine équipée de Windows 2000, cela ne fonctionne pas même une seule fois.
Si vous avez des pistes de recherche, n'hésitez pas à me les communiquer.
Merci de m'avoir lu!!!

Michel

fredericmazue

Quote:

Sur ma machine de dev : j'arrive à me connecter et très rapidement

Tu es sûr d'être connecté ? Je me permets la question car

Quote:
{System.Data.OleDb.OleDbException: Aucune message d'erreur disponible, code de résultat : -2147417851(0x80010105). 
   à System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)  

l'exception semble bien provenir du constructeur de la connexion (..ctor) ce qui me donne à penser que tu ne te connectes pas en fait. Peut être une chaîne de connection erronée ?

Quote:

En transférant les fichiers sur une machine équipée de Windows 2000, cela ne fonctionne pas même une seule fois.

Mais cela ne signifie pas forcément que le problème soit le même. On peut imaginer que sur l'autre machine le founisseur de données soit absent ou bien qu'un pare-feu fasse du zèle

En espérant t'avoir donné une piste

Michelk12_8898

Merci Fred,

Oui, je suis sûr d'être connecté, en mode de déboguage (que je commence à maîtriser!) tout mon objet reviens rempli avec les données voulues provenant d'une table d'identification.

Etape 1 :
Sur l'application elle-même, je m'identifie, me déconnecte, m'identifie, me déconnecte, m'identifie et... problème plus rien n'a faire pour que cela fonctionne à nouveau :cry:

Je ferme Visual Web Developer Express, l'ouvre à nouveau et goto Etape 1;

Est-ce une piste possible?
Et pourquoi avec une table identique sous Access il n'y aucun problème et qu'avec Informix... :(

Puis j'ai fait des scripts shell en masse, du C sous Unix, du C++ sous Windows, de l'ASP et me disais que cela serait une bonne occasion d'accepter une mission en C#/Visual Web Developer... pour l'instant c'est à me dégouter de cet outil. :cry:

Autre chose, j'ai une fonction :

    protected static IDbConnection OpenConnection()
    {
        if (transac != null)		 // on est en mode transaction
            return transac.Connection;
        else
        {
            OleDbConnection cnx = new OleDbConnection(ConnexionString);
            cnx.Open();
            return cnx;
        }
    }

En déboguage, et sur la ligne du cnx.Open() et même lorsque je j'arrive à me connecter, il y a la variable locale ServerVersion qui lève une exception qui semble passer inaperçue :

'cnx.ServerVersion' a levé une exception de type 'System.InvalidOperationException'	string {System.InvalidOperationException}

Avec :

base	{"Opération non valide. La connexion est fermée."}	System.SystemException {System.InvalidOperationException}

Ai mal fait quelque chose:?:

Michel

fredericmazue

Quote:

Oui, je suis sûr d'être connecté,

Ben non, il me semble que tu dis le contraire 3 lignes plus bas.

Quote:

Etape 1 :
Sur l'application elle-même, je m'identifie, me déconnecte, m'identifie, me déconnecte, m'identifie et... problème plus rien n'a faire pour que cela fonctionne à nouveau

Donc si je comprends bien, tu te connectes, déconnectes, reconnectes de multiples fois, jusqu'au moment où tu ne parviens plus à te connecter.
Donc quand tu as le problème, tu n'es pas connecté, comme le laisse entendre l'exception que tu donnes dans ton premier post.

Quote:

Est-ce une piste possible?
Et pourquoi avec une table identique sous Access il n'y aucun problème et qu'avec Informix...

La piste c'est que Access n'est pas Informix...
Les SGDBR et leurs pilotes (ou founisseurs de données si tu préfères) ne sont pas les mêmes, donc ne se comportent pas pareil. Bon ils servent tous deux des données c'est entendu ;) mais entre le moment où tu te connectes et celui où tu récupères tes données il s'en passe des choses.

AMHA ton problème présente le parfait symptôme d'une fuite de connexions dans un pool. Avec un langage comme C# (ou Java, puisque ce sont les mêmes ;) ) ça se produit quand une exception est mal gerée, voire muselée. Exemple en pseudo code:

try
{
OuvrirConnexion
FaireQuelquechose // Poum !! une exception levée ici
FermerConnexion
}
catch
{
TraiterException
}

Dans cet exemple ta connexion n'est pas fermée. Si tu es avec Access qui ne connaît pas les pools de connexions, la connexion est bien fermée à la sortie du bloc try si l'exception se produit MAIS si tu travailles avec un pool de connexion sous Informix (ce que je ne sais pas, mais on dirait que oui) alors la connexion peut ne pas être pas fermée si l'objet Connexion est conçu ainsi. Pour y remédier tu dois reprendre ton code pour toujours fermer explicitement les connexions comme ceci:

try
{
OuvrirConnexion
FaireQuelquechose // Poum !! une exception levée ici

}
catch
{
TraiterException
}
finally
{
FermerConnexion
}

Pour le second problème je ne sais pas à priori, sauf qu'il me semble que ça pourrait être un effet de bord du premier. Essaie de régler d'abord le premier.

Voilà j'espère t'avoir aidé. Tiens nous au courant :)

Michelk12_8898

Hello,

J'ai installé une version plus récente de IBM Informix-Connect (version 2.90), résultat : même soucis mais le message d'erreur change :

{System.Data.OleDb.OleDbException: Échec de IErrorInfo.GetDescription avec E_NOINTERFACE(0x80004002).
   à System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
   à System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   à System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
   à System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   à System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   à System.Data.OleDb.OleDbConnection.Open()
   à SGBDFactory.OpenConnection() dans etc.
}

Si j'oublis mon code un instant et utilise l'explorateur de base de données afin d'ajouter une nouvelle connexion OLE DB et clique sur "Tester la connexion", j'obtiens :
"Le test de la connexion a réussi." :D
Je ferme la messageBox et clique à nouveau sur "Tester la connexion", j'obtiens :
"Echec de IErrorInfo.GetDescription avec E_NOINTERFACES(0x80004002)." :(

Suis avancé...

fredericmazue

Quote:

même soucis mais le message d'erreur change :

Si tu regardes bien, c'est la même erreur, Quoique que formulée un peu différement. :(

Enfin il me semble.

Quote:

Si j'oublis mon code un instant

Je crois que tu peux. Comme tu présentes la chose maintenant, on dirait bienun problème avec le(s) pilote(s)

Ca semble même certain si j'en crois ce que je vois là:
[url]
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=332805&SiteID=1
[/url]

En espérant que ça t'aide.

Michelk12_8898
Ayez! Presque...

Hello Frederic,

J'ai la vague impression que c'est le pilote OLE DB d'IBM qui ne fonctionne pas correctement.

Du coup, j'ai remplacé mes objets oledb par odbc avec le même pilote et cela fonctionne au quart de tour! :D

Par contre... (et oui) je sèche sur un nouveau problème.
On m'a passé une machine toute neuve avec Windows 2000 server et y ai installé Framework 2.0, pilote ODBC, etc. lorsque je test la connexion odbc : "Test connection was successful"

Je transfert alors tout le contenu de mon "WebSite" vers cette machine.
Celle-ci affiche correctement la page d'accès (login/mot de passe) et ne va pas plus loin. J'imagine que l'application doit passer sur une exception lorsque je cherche à m'identifier et ne me le dis pas. :?

Je n'arrive pas à remonter l'information côté client. Ai tenté de jouer avec le <%@ Page Language="C#" trace="true"... mais rien de ce qui provient du serveur ne semble m'intéresser :(

Comment faites-vous ?

Sinon, il m'a l'air limité parfois le Visual Web Developer Express, j'ai l'impression qu'il y a des fonctions intéressantes sous Visual Studio mais qui ne se trouvent pas toujours dans mes objets.

Enfin et très sincèrement : merci pour votre aide.

Michel

fredericmazue

Bonsoir,

Quote:

J'ai la vague impression que c'est le pilote OLE DB d'IBM qui ne fonctionne pas correctement.

Plus qu'une vague impression, c'est sûr :( comme dit dans le post précédent.

Quote:

Celle-ci affiche correctement la page d'accès (login/mot de passe) et ne va pas plus loin. J'imagine que l'application doit passer sur une exception lorsque je cherche à m'identifier et ne me le dis pas.

Ca parait quand même curieux. L'exception a sans doute été muselée quelque part par mégarde.

Quote:

Sinon, il m'a l'air limité parfois le Visual Web Developer Express, j'ai l'impression qu'il y a des fonctions intéressantes sous Visual Studio mais qui ne se trouvent pas toujours dans mes objets.

Je ne sais pas, je n'utilise pas l'Express. Mais Express ou pas, je vois mal pourquoi une exception d'echec à la connexion ne remonterait pas.

Quote:

Enfin et très sincèrement : merci pour votre aide

C'est avec plaisir.

Michelk12_8898

Hello,

J'ai une "abstract class" où je centralise toutes les différents accès à la base de données.
Entre autres ce petit bout de

protected static IDataReader Select(string sql)
    {
        IDbConnection cnx = null;
        IDbCommand cmd = null;
        IDataReader reader = null;

        try
        {
            cnx = OpenConnection();
            cmd = CreateCommand(cnx, sql);
            reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception err)
        {
            reader = null;
        }
        finally
        {
            CloseCommand(cmd);
        }

        return reader;
    }

Lorsque je passe dans le catch, cela n'empêche pas de retourner null.
D'ailleurs dans ce cas, je ne sais pas si c'est parcequ'il y a exception ou si la requête ne retourne rien.

Et lorsque je teste sur ma nouvelle machine : je suis persuader de ce que je saisi alors que reste-t-il? :wink:

Michel

Michelk12_8898
Ayez!

Hello,

Enfin réussi à remonter le problème au client :
"The .NET Framework Odbc Data Provider requires Microsoft Data Access Components(MDAC) version 2.6 or later. Version 2.53.6200.1 was found currently installed." :D

A bientôt sans doute :wink:

Michel