diff --git a/src/Spring/Spring.Data.NHibernate12/Data/NHibernate/HibernateAccessor.cs b/src/Spring/Spring.Data.NHibernate12/Data/NHibernate/HibernateAccessor.cs index b7e0b6ee..8ec3ed39 100644 --- a/src/Spring/Spring.Data.NHibernate12/Data/NHibernate/HibernateAccessor.cs +++ b/src/Spring/Spring.Data.NHibernate12/Data/NHibernate/HibernateAccessor.cs @@ -444,15 +444,9 @@ namespace Spring.Data.NHibernate /// /// the corresponding DataAccessException instance /// - protected virtual DataAccessException ConvertAdoAccessException(ADOException ex) + protected virtual DataAccessException ConvertAdoAccessException(ADOException ex) { - - string sqlString = (ex.SqlString != null) - ? ex.SqlString.ToString() - : string.Empty; - return AdoExceptionTranslator.Translate( - "Hibernate operation: " + ex.Message, sqlString, ex.InnerException); - + return SessionFactoryUtils.ConvertAdoAccessException(AdoExceptionTranslator, ex); } /// diff --git a/src/Spring/Spring.Data.NHibernate12/Data/NHibernate/SessionFactoryUtils.cs b/src/Spring/Spring.Data.NHibernate12/Data/NHibernate/SessionFactoryUtils.cs index e14fd451..1cf70172 100644 --- a/src/Spring/Spring.Data.NHibernate12/Data/NHibernate/SessionFactoryUtils.cs +++ b/src/Spring/Spring.Data.NHibernate12/Data/NHibernate/SessionFactoryUtils.cs @@ -401,6 +401,39 @@ namespace Spring.Data.NHibernate #endregion + /// + /// Converts a Hibernate ADOException to a Spring DataAccessExcption, extracting the underlying error code from + /// ADO.NET. Will extract the ADOException Message and SqlString properties and pass them to the translate method + /// of the provided IAdoExceptionTranslator. + /// + /// The IAdoExceptionTranslator, may be a user provided implementation as configured on + /// HibernateTemplate. + /// + /// The ADOException throw + /// The translated DataAccessException or UncategorizedAdoException in case of an error in translation + /// itself. + public static DataAccessException ConvertAdoAccessException(IAdoExceptionTranslator translator, ADOException ex) + { + try + { + string sqlString = (ex.SqlString != null) + ? ex.SqlString.ToString() + : string.Empty; + return translator.Translate( + "Hibernate operation: " + ex.Message, sqlString, ex.InnerException); + } catch (Exception e) + { + log.Error("Exception thrown during exception translation. Message = [" + e.Message + "]", e); + log.Error("Exception that was attempted to be translated was [" + ex.Message + "]", ex); + if (ex.InnerException != null) + { + log.Error(" Inner Exception was [" + ex.InnerException.Message + "]", ex.InnerException); + } + throw new UncategorizedAdoException(e.Message, "", "", e); + } + + } + /// /// Convert the given HibernateException to an appropriate exception from the /// Spring.Dao hierarchy. Note that it is advisable to diff --git a/src/Spring/Spring.Data.NHibernate20/Data/NHibernate/LocalSessionFactoryObject.cs b/src/Spring/Spring.Data.NHibernate20/Data/NHibernate/LocalSessionFactoryObject.cs index ba903f17..1f521b87 100644 --- a/src/Spring/Spring.Data.NHibernate20/Data/NHibernate/LocalSessionFactoryObject.cs +++ b/src/Spring/Spring.Data.NHibernate20/Data/NHibernate/LocalSessionFactoryObject.cs @@ -1062,11 +1062,7 @@ namespace Spring.Data.NHibernate /// protected virtual DataAccessException ConvertAdoAccessException(ADOException ex) { - - string sqlString = (ex.SqlString != null) ? ex.SqlString.ToString() : string.Empty; - return AdoExceptionTranslator.Translate( - "Hibernate operation: " + ex.Message, sqlString, ex.InnerException); - + return SessionFactoryUtils.ConvertAdoAccessException(AdoExceptionTranslator, ex); } #endregion