Bonjour,
je suis en train de développer une petite application utilisant NHibernate sur une base de données MySQL 5.0. Je développe dans le langage c#.
Sachant qu'il ne s'agit d'un projet console simple.
Voici la table de la base :
Citation:
CREATE TABLE users (
LogonID varchar(20) primary key NOT NULL default '0',
Name varchar(40) default NULL,
Password varchar(20) default NULL,
EmailAddress varchar(40) default NULL,
LastLogon date default NULL);
|
Voici ma class entity User :
Citation:
Code :
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace persistance_NHibernate
- {
- public class User
- {
- private string id;
- private string userName;
- private string password;
- private string emailAddress;
- private DateTime lastLogon;
- public User()
- {
- }
- public string Id
- {
- get { return id; }
- set { id = value; }
- }
- public string UserName
- {
- get { return userName; }
- set { userName = value; }
- }
- public string Password
- {
- get { return password; }
- set { password = value; }
- }
- public string EmailAddress
- {
- get { return emailAddress; }
- set { emailAddress = value; }
- }
- public DateTime LastLogon
- {
- get { return lastLogon; }
- set { lastLogon = value; }
- }
- }
- }
|
Voici mon fichier de mapping User.hbm.xml:
Citation:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="persistance_NHibernate.User, persistance_NHibernate" table="users">
<id name="Id" column="LogonId" type="String" length="20">
<generator class="assigned" />
</id>
<property name="UserName" column="Name" type="String" length="40"/>
<property name="Password" type="String" length="20"/>
<property name="EmailAddress" type="String" length="40"/>
<property name="LastLogon" type="DateTime"/>
</class>
</hibernate-mapping>
|
Voici mon fichier App.config.xml qui configure mon application :
Citation:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<!-- Sélectionnez le type de base de donnée à utiliser et définissez sa ChaîneDeConnexion -->
<!-- Valeurs possibles: Access, MSSQL ou MySQL -->
<appSettings>
<add key="BaseDeDonnées" value="MySQL" />
<add key="Access.ChaîneDeConnexion" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=nhibernate.mdb" />
<add key="MSSQL.ChaîneDeConnexion" value="Data Source=(local);Initial Catalog=nhibernate;Integrated Security=SSPI" />
<add key="MySQL.ChaîneDeConnexion" value="Server=localhost;Database=commande;User ID=root;Password=root" />
</appSettings>
<!-- ................................................................................. -->
<!-- Cette section contient les informations nécessaires à la configuration de log4net -->
<!-- ................................................................................. -->
<log4net>
<!-- Définie une sortie (où les textes de débogage peuvent aller) -->
<appender name="SortieVersUnFichier" type="log4net.Appender.FileAppender, log4net">
<param name="File" value="log.txt" />
<param name="AppendToFile" value="false" />
<layout type="log4net.Layout.PatternLayout, log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] <%X{auth}> - %m%n" />
</layout>
</appender>
<!-- Définie la catégorie racine, son niveau de priorité par défaut et ajoute le(s) sortie(s) (où les textes de débogage vont aller) -->
<root>
<priority value="WARN" />
<appender-ref ref="SortieVersUnFichier" />
</root>
<!-- Spécifie le niveau de certain namespaces -->
<!-- Le niveau peut être : ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF -->
<logger name="NHibernate">
<level value="INFO" />
</logger>
</log4net>
<!-- .................................................................................... -->
<!-- Cette section contient les informations nécessaires à la configuration de NHibernate -->
<!-- .................................................................................... -->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<!-- an ISessionFactory instance -->
<session-factory name="nhibernate_commande">
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
NHibernate.Driver.MySqlDataDriver
</property>
<property name="dialect">
NHibernate.Dialect.MySQL5Dialect
</property>
<property name="connection.connection_string">
Server=localhost;Database=commande;User ID=root;Password=root
</property>
<property name="show_sql">false</property>
<mapping assembly="persistance_NHibernate" />
<!-- mapping files
<mapping resource="persistance_NHibernate.User.hbm.xml" assembly="persistance_NHibernate" /> -->
</session-factory>
</hibernate-configuration>
</configuration>
|
Puis, voici mon humble code :
Citation:
Code :
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using NHibernate;
- namespace persistance_NHibernate
- {
- class Program
- {
- [System.STAThread]
- static void Main(string[] args)
- {
- System.Console.Out.WriteLine("L'application démarre...\n" );
- try
- {
- System.Console.Out.WriteLine("Configuration de NHibernate...\n" );
- //Connection à la base de données MySql VIA le fichier de configuration App.config.xml
- ISessionFactory factory = new NHibernate.Cfg.Configuration()
- .Configure("App.config.xml" )
- .BuildSessionFactory();
- //Ouverture d'une session sur la base
- ISession session = factory.OpenSession();
- //Ouverture d'une transaction
- ITransaction transaction = session.BeginTransaction();
- transaction.Begin();
- //Création d'un nouvel utilisateur
- User newUser = new User();
- newUser.Id = "joe_cool";
- newUser.UserName = "Joseph Cool";
- newUser.Password = "abc123";
- newUser.EmailAddress = "joe@cool.com";
- newUser.LastLogon = DateTime.Now;
- //Appel de NHibernate pour que l'objet soit sauvé
- session.Save(newUser);
- // commit pour valider la transaction
- transaction.Commit();
- session.Close();
- }
- catch (System.Exception ex)
- {
- System.Console.Error.WriteLine("\n\n" + ex.ToString() + "\n\n" );
- }
- finally
- {
- System.Console.Out.WriteLine("\nL'application est fermée!\n" );
- System.Console.ReadLine();
- }
- }
- }
- }
|
Et pour finir voici le message d'erreur que me crache la console :
L'application démarre...
Configuration de NHibernate...
NHibernate.ADOException: cannot open connection ---> System.InvalidOperationExce
ption: Connection must be valid and open
à MySql.Data.MySqlClient.MySqlCommand.CheckState()
à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
à MySql.Data.MySqlClient.Driver.ShowWarnings(Int32 count)
à MySql.Data.MySqlClient.NativeDriver.ReadEOF(Boolean readPacket)
à MySql.Data.MySqlClient.NativeDriver.ReadFieldMetadata(Int32 count, MySqlFie
ld[]& fields)
à MySql.Data.MySqlClient.CommandResult.Load()
à MySql.Data.MySqlClient.MySqlDataReader.NextResult()
à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
à MySql.Data.MySqlClient.Driver.Configure(MySqlConnection connection)
à MySql.Data.MySqlClient.NativeDriver.Configure(MySqlConnection connection)
à MySql.Data.MySqlClient.MySqlConnection.Open()
à NHibernate.Connection.DriverConnectionProvider.GetConnection()
à NHibernate.Impl.SessionFactoryImpl.OpenConnection()
--- Fin de la trace de la pile d'exception interne ---
à NHibernate.Impl.SessionFactoryImpl.OpenConnection()
à NHibernate.Impl.ConnectionManager.GetConnection()
à NHibernate.Impl.SessionImpl.get_Connection()
à NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)
à NHibernate.Transaction.AdoTransaction.Begin()
à NHibernate.Impl.ConnectionManager.BeginTransaction()
à NHibernate.Impl.SessionImpl.BeginTransaction()
à persistance_NHibernate.Program.Main(String[] args) dans D:\Mes Documents\Vi
sual Studio 2008\Projects\persistance_NHibernate\persistance_NHibernate\Program.
cs:ligne 29
L'application est fermée!
|
Apparemment il y a un problème de connection avec MySql, mais je suis bloqué, je suis a cours d'idée de possibilité de debogage.
Si quelqu'un peut m'aider ???
Cordialement