我可以以某种方式获取导致GenericADOException(约束异常)的对象吗?NHibernate/Castle activerecord:如何获取导致数据库异常的对象?
或者我怎样才能刷新一个对象,以便我可以告诉哪一个是问题。
我有一个对象的列表显示在窗体中,可以编辑和添加到。在刷新它给我一个数据库异常,但我不知道哪个对象给出了例外。
我无法将约束移动到nhibernate。
我可以以某种方式获取导致GenericADOException(约束异常)的对象吗?NHibernate/Castle activerecord:如何获取导致数据库异常的对象?
或者我怎样才能刷新一个对象,以便我可以告诉哪一个是问题。
我有一个对象的列表显示在窗体中,可以编辑和添加到。在刷新它给我一个数据库异常,但我不知道哪个对象给出了例外。
我无法将约束移动到nhibernate。
通过一些谷歌上搜索我的职位,是有帮助的,然后通过读NHibernate的源我有以下几点:
http://fabiomaulo.blogspot.com/2009/06/improving-ado-exception-management-in.html
'http://fabiomaulo.blogspot.com/2009/06/improving-ado-exception-management-in.html
'properties.Add("sql_exception_converter", "SmartCore.SmartDatabaseExceptionConverter, SmartCore")
Class SmartDatabaseExceptionConverter
Implements ISQLExceptionConverter
Public Function Convert(ByVal sqlException As System.Exception, ByVal message As String, ByVal sql As NHibernate.SqlCommand.SqlString) As NHibernate.ADOException Implements NHibernate.Exceptions.ISQLExceptionConverter.Convert
Dim sqle As DbException
sqle = ADOExceptionHelper.ExtractDbException(sqlException)
'"could not update: [SmartCore.GL.Glaccount#1225]"
Dim obname As String
Dim key As String
obname = ExtractUsingTemplate("could not update: [", "#", message)
key = ExtractUsingTemplate("#", "]", message)
Dim prikey As Integer
prikey = Integer.Parse(key)
sqle.Data.Add("obname", obname)
sqle.Data.Add("prikey", key)
If sqle.ErrorCode = 335544558 Then
'"Operation violates CHECK constraint C_GLACCOUNT on view or table GLACCOUNT At trigger 'CHECK_56'"
Dim checkname As String
checkname = ExtractUsingTemplate("Operation violates CHECK constraint ", "on view or table ", sqle.Message)
Return New SmartDatabaseConstraintException(message, sqle, obname, prikey, checkname)
'Return New ConstraintViolationException(message, sqle, sql, checkname)
End If
Return SQLStateConverter.HandledNonSpecificException(sqlException, message, sql)
End Function
Protected Function ExtractUsingTemplate(ByVal templateStart As String, ByVal templateEnd As String, ByVal message As String) As String
Dim templateStartPosition As Integer = message.IndexOf(templateStart)
If templateStartPosition < 0 Then
Return Nothing
End If
Dim start As Integer = templateStartPosition + templateStart.Length
Dim [end] As Integer = message.IndexOf(templateEnd, start)
If [end] < 0 Then
[end] = message.Length
End If
Return message.Substring(start, [end] - start).Trim()
End Function
End Class
'USAGE
Try
_scope.Flush()
Catch ex As SmartDatabaseConstraintException
If ex.ConstraintName = "C_GLACCOUNT" Then
Dim gla As GL.Glaccount
gla = GL.Glaccount.Find(ex.EntityId) 'should be fast from entity cache
msgboxError(gla.description & " is duplicate please rename")
Else
msgboxError(ex.Message)
End If
End Try
我不得不适应它与我稍微过时的nhibernate版本(从3月2.1)我将不得不稍微适应上述新版本,其中有一个AdoExceptionContextInfo从中可以获得对象名称和ID。 Nhibernate很好!
您是否尝试过使用NHibernate Profiler?它应该给你更多的细节,问题是哪一个。
我通过眼球知道哪一个导致了问题,问题是如何通过代码来确定。我需要在代码中知道哪些对象正在给出问题,以便我可以修改或删除它。 考虑数据库中的唯一约束。 – AngelBlaZe 2009-07-16 14:09:33