2010-12-09 4 views
0

En utilisant .Net et NHibernate, je dessine des données à partir d'une table MySql-Database. Cela contient une colonne de type de données MySQL-Timestamp avec la valeur zéro par défaut (0000-00-00 00:00:00).Comment recevoir zéro valeurs d'horodatage MySQL

Je mappe la colonne à un membre DateTime de ma classe. Lors de la création d'un critère, NHibernate se plaint du mauvais format. Je veux transformer les valeurs nulles en valeurs valides. Est-ce possible?

Mise à jour: J'ai essayé d'implémenter l'interface IUserType dans la classe que je veux mapper. Cependant, cela ne semble pas aider beaucoup pour le moment. Cela ressemble à ceci:

public virtual object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner) 
    { 
     if (rs.IsDBNull(rs.GetOrdinal(names[6])) || rs.GetDateTime(6) < DateTime.MinValue) return DateTime.MinValue; 
     else 
      return rs.GetDateTime(6); 
    } 

Je ne sais pas si c'est correct. (La valeur DateTime qui provoque des problèmes est la propriété 6 de la classe.)

Mon programme se brise à ce code:

ISession session = GetCurrentSession(); 
return session.CreateCriteria<ClassToMap>().List<ClassToMap>(); 

Répondre

0

Si vous avez quelque chose que vous souhaitez mapper à MySQL sur le fin, et vous avez le contrôle de la requête, dans votre déclaration SELECT que vous pouvez faire quelque chose comme

SELECT IF(field!='0000-00-00 00:00:00',field,'2010-01-01 00:00:00') 
FROM table 

remplissage du field, table, etc, où 2010-01-01 00:00:00 est ce que je cartographié la zéro valeurs à.

+0

Non, j'utilise NHibernate, qui fait le SQL pour moi. – AGuyCalledGerald

0

Vous pouvez implémenter IUserType et gérer les données de retour MySql comme vous le souhaitez.

// represents conversion on load-from-db operations: 
    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     //Custom Logic 
    } 
+0

J'ai essayé d'implémenter l'interface IUserType dans la classe que je veux mapper. Cependant, cela ne semble pas aider beaucoup pour le moment. Mon programme casse à ce code: Session ISession = GetCurrentSession(); return session.CreateCriteria () .Liste (); <- ici – AGuyCalledGerald

+0

vous ne devez pas implémenter Iusertype dans la classe que vous souhaitez mapper. – DanielGomez

+0

Désolé, vous n'avez pas à implémenter Iusertype dans la classe que vous voulez mapper. Vous devez créer une classe publique qui implémente Iusertype, puis déclarer dans votre map la propriété qui contient la valeur d'horodatage comme type que vous avez créé. – DanielGomez