0
votes

I am calling Save on an NHibernate object that has many children attached to it. Upon save, sometimes an error happens when NHibernate starts inserting into my sql database ("The data was truncated while converting from one data type to another." for instance). Following are the top lines of an example Exception. NHibernate never tells me more than just...it failed. My question is, how do I figure out which table/column is the culprit within my save error?

at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor, Boolean& isBaseTableCursor) at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (CommandBehavior behavior, String method, ResultSetOptions options) at System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery() at NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd) at NHibernate.Id.Insert.AbstractSelectingDelegate.PerformInsert (SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object [] fields, Boolean[] notNull, SqlCommandInfo sql, Object obj, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object [] fields, Object obj, ISessionImplementor session) at NHibernate.Action.EntityIdentityInsertAction.Execute()

1

1 Answers

1
votes

The problem is that the error happens in the SqlServerCe library. So NHibernate can't tell you what's wrong.

Most probably you have chosen a datatype in the mapping file that is not the same in the database (eg. you have a number in the model and a varchar in the database). The database performs a implicit cast, and if it fails, you get this error.

You can find it by:

  • watching the values in the debugger and try to find one that is larger then usual
  • reading your mapping file and class declarations and compare it with you database model
  • exporting the model using SchemaExport and compare the exported model with yours.