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 :
Voici ma class entity User :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 mon fichier de mapping User.hbm.xml: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 App.config.xml qui configure mon application :<?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>
Puis, voici mon humble code :<?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>
Et pour finir voici le message d'erreur que me crache la console :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();
}
}
}
}
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.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!
Si quelqu'un peut m'aider ???
Cordialement
Partager