NHibernate et MySql 5.0

NHibernate et MySql 5.0 - C#/.NET managed - Programmation

Marsh Posté le 15-04-2008 à 16:54:44    

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 :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace persistance_NHibernate
  6. {
  7. public class User
  8. {
  9. private string id;
  10. private string userName;
  11. private string password;
  12. private string emailAddress;
  13. private DateTime lastLogon;
  14. public User()
  15. {
  16. }
  17. public string Id
  18. {
  19. get { return id; }
  20. set { id = value; }
  21. }
  22. public string UserName
  23. {
  24. get { return userName; }
  25. set { userName = value; }
  26. }
  27. public string Password
  28. {
  29. get { return password; }
  30. set { password = value; }
  31. }
  32. public string EmailAddress
  33. {
  34. get { return emailAddress; }
  35. set { emailAddress = value; }
  36. }
  37. public DateTime LastLogon
  38. {
  39. get { return lastLogon; }
  40. set { lastLogon = value; }
  41. }
  42. }
  43. }


 
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] &lt;%X{auth}&gt; - %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 :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using NHibernate;
  6. namespace persistance_NHibernate
  7. {
  8. class Program
  9. {
  10. [System.STAThread]
  11. static void Main(string[] args)
  12. {
  13. System.Console.Out.WriteLine("L'application démarre...\n" );
  14. try
  15. {
  16. System.Console.Out.WriteLine("Configuration de NHibernate...\n" );
  17. //Connection à la base de données MySql VIA le fichier de configuration App.config.xml
  18. ISessionFactory factory = new NHibernate.Cfg.Configuration()
  19. .Configure("App.config.xml" )
  20. .BuildSessionFactory();
  21. //Ouverture d'une session sur la base
  22. ISession session = factory.OpenSession();
  23. //Ouverture d'une transaction
  24. ITransaction transaction = session.BeginTransaction();
  25. transaction.Begin();
  26. //Création d'un nouvel utilisateur
  27. User newUser = new User();
  28. newUser.Id = "joe_cool";
  29. newUser.UserName = "Joseph Cool";
  30. newUser.Password = "abc123";
  31. newUser.EmailAddress = "joe@cool.com";
  32. newUser.LastLogon = DateTime.Now;
  33. //Appel de NHibernate pour que l'objet soit sauvé
  34. session.Save(newUser);
  35. // commit pour valider la transaction
  36. transaction.Commit();
  37. session.Close();
  38. }
  39. catch (System.Exception ex)
  40. {
  41. System.Console.Error.WriteLine("\n\n" + ex.ToString() + "\n\n" );
  42. }
  43. finally
  44. {
  45. System.Console.Out.WriteLine("\nL'application est fermée!\n" );
  46. System.Console.ReadLine();
  47. }
  48. }
  49. }
  50. }


 
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

Reply

Marsh Posté le 15-04-2008 à 16:54:44   

Reply

Marsh Posté le 17-04-2008 à 09:29:07    

Salut,
essaye ça.
PS: ma config est fait avec Sql server, j'ai fait un copier/coller de ma config donc il doit rester quelque ligne en SQL...
 
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nhibernate"
      type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <nhibernate>
    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
    <add key="hibernate.dialect" value="NHibernate.Dialect.MySQL5Dialect " />
    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.MySqlDataDriver " />
    <add key="hibernate.connection.connection_string" value="Server=localhost;Initial Catalog=commande;User ID=root;Password=root; Max Pool Size=1000;Min Pool Size=1" />
    <add key="hibernate.show_sql" value="true" />
  </nhibernate>
  <log4net>
    <!-- Define some output appenders -->
    <appender name="trace" type="log4net.Appender.TraceAppender, log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/>
      </layout>
    </appender>
    <appender name="console" type="log4net.Appender.ConsoleAppender, log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/>
      </layout>
    </appender>
    <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
      <param name="File" value="c:\temp\log.txt"/>
      <param name="AppendToFile" value="false"/>
      <param name="RollingStyle" value="Date"/>
      <param name="DatePattern" value="yyyy.MM.dd"/>
      <param name="StaticLogFileName" value="true"/>
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"/>
      </layout>
    </appender>
    <root>
      <priority value="DEBUG"/>
      <appender-ref ref="console"/>
    </root>
  </log4net>

Reply

Marsh Posté le 17-04-2008 à 10:09:40    

Bonjour,
merci pour ta réponse.
En fait j'ai trouvé la solution a mon problème. Je vais donc la donner pour capitaliser.
Donc pour mettre en place NHibernate 1.2 sous Visual Studio avec une base de données MySQL 5.0 il faut :  
 

Reply

Marsh Posté le 17-04-2008 à 10:14:12    

Oups désolé...
Donc il faut :  
    - Le fichier de configuration suivant :  


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!-- Add this element -->
  <configSections>
    <section
    name="hibernate-configuration"
    type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"
/>
  </configSections>
  <!-- Add this element -->
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <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>
      <mapping assembly="QuickStart" />
 
    </session-factory>
  </hibernate-configuration>
 
</configuration>


 
Ensuite, il faut aussi ne pas oublier pour les fichiers de Mapping : nomDeTable.hbm.xml
de les déclarer comme ressource embarqué (Embedded Ressource).
Pour ce faire, il faut faire un click droit sur le fichier et choisir "Propiétés".
Ensuite choisir "Build Action" et lui affecter la valeur "Embedded Ressource".
 
Et voila, normalement tout fonctionne... Enfin pour moi ça marche.
 
En espérant que cette solution sera utile a quelqu'un.

Reply

Marsh Posté le 17-04-2008 à 10:17:55    

J'ai oublié de dire aussi, qu'il faut copier à la racine du projet les dll suivantes :  
ICSharpCode.SharpZipLib.dll et MySql.Data.dll
 
Le premier se trouve dans l'install de NHibernate.
Et MySql.Data.dll se trouve dans l'install de MySql. Car il ne faut pas oublier d'installer "mysql-connector-net-5.0.8.1.exe"
Sans quoi la liaison entre MySql et .net est impossible.
 
En fait ça en fait des choses. Même s'il n'y a rien de compliqué dans tout ça .

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed