2010-12-09 19 views
0

Mit. NET und NHibernate, zeichne ich Daten aus einer MySql-Datenbank Tabelle. Dies enthält eine Spalte vom Datentyp MySQL-Timestamp mit dem Standard-Nullwert (0000-00-00 00:00:00).Wie bekomme ich Null MySQL-Timestamp-Werte

Ich ordnet die Spalte einem DateTime-Member meiner Klasse zu. Beim Erstellen eines Kriteriums klagt NHibernate über falsches Format. Ich möchte die Nullwerte in gültige Werte umwandeln. Ist das möglich?

Update: Ich habe versucht, die IUserType-Schnittstelle in der Klasse zu implementieren, die ich zuordnen möchte. Dies scheint jedoch noch nicht viel zu helfen. Es sieht so aus:

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); 
    } 

Ich habe keine Ahnung, ob das richtig ist. (Der Wert Datetime, die Probleme verursacht, ist die 6. Eigenschaft der Klasse.)

Mein Programm an diesem Code bricht:

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

Antwort

0

Wenn Sie etwas haben, Sie möchten, dass es auf der Karte zu auf der MySQL Ende, und Sie haben die Kontrolle über die Abfrage, in Ihrer SELECT Anweisung Sie so etwas wie

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

Füllung in das tun kann field, table, etc, wo 2010-01-01 00:00:00 ist, was ich kartiert die Nullwerte zu.

+0

Nein, ich benutze NHibernate, die SQL für mich tut. – AGuyCalledGerald

0

Sie können IUserType implementieren und MySql-Daten so verwalten, wie Sie möchten.

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

Ich habe versucht, die IUserType-Schnittstelle in der Klasse zu implementieren, die ich zuordnen möchte. Dies scheint jedoch noch nicht viel zu helfen. Mein Programm bricht bei diesem Code ab: ISession session = GetCurrentSession(); return session.CreateCriteria () .List (); <- hier – AGuyCalledGerald

+0

Sie müssen Iusertype nicht in der Klasse implementieren, die Sie zuordnen möchten. – DanielGomez

+0

Entschuldigung, Sie müssen Iusertype nicht in der zuzuordnenden Klasse implementieren. Sie müssen eine öffentliche Klasse erstellen, die Iusertype implementiert, und dann in Ihrer Map die Eigenschaft deklarieren, die den Wert des Zeitstempels als Typ enthält, den Sie erstellt haben. – DanielGomez