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