我有一个奇怪的问题,我现在试图修复超过2天。
我有一个包含236列的表,使用流畅的nHibernate进行映射。
FluentConfiguration configuration = Fluently. Configure (). Database (pConfigurer).Mappings(m =>
{
m.HbmMappings.AddFromAssemblyOf<T>();
m.FluentMappings.AddFromAssemblyOf<T>();
})
使用长度
映射的文本或varchar(max)或varchar(800)列很少。 Map(x => x.ScDirectorFeeDesc).Column("sc_director_fee_desc").Length(2147483647)
只要我从数据库读取值,即使长度超过1000或更多,一切都很顺利。
当我尝试修改超过1000 的字符串并尝试保存或当我尝试在那里保存新值时,我遇到问题,它踢了我一个例外...
Could not synchronize database state with session
NHibernate.Exceptions.GenericADOException: could not execute batch command.[SQL: SQL not available] ---> System.Data.SqlClient.SqlException: String or binary data would be truncated.
The statement has been terminated.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery()
at NHibernate.AdoNet.SqlClientSqlCommandSet.ExecuteNonQuery()
at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps)
--- End of inner exception stack trace ---
at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps)
at NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand ps)
at NHibernate.AdoNet.AbstractBatcher.ExecuteBatch()
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
at NHibernate.Engine.ActionQueue.ExecuteActions()
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session
我使用的是Fluent 1.3.0.733和NHibernate 3.3.1.4000
如果有人知道这里的问题,请告诉我,这将非常有帮助。
我尝试过提及StringClob&amp;在映射中使用文本SQLTypes,我甚至尝试将列类型更改为4000,但它不会保存它但会抛出异常。
谢谢, 萨库马尔
答案 0 :(得分:0)
您遇到的错误是SQL Server错误,text / ntext和nvarchar(max)列不会发生这种错误。
如果行的所有列长度(不包括text / ntext / nvarchar(max)/ xml / image)的总和超过最大行大小(8060字节,请参阅http://technet.microsoft.com/en-us/library/ms143432.aspx)< / p>
您应该总结列定义的长度,看它是否超过8060(nvarchar计数两次)。 如果是这样,您可能在创建表时收到警告。您应该查看要插入的数据的总长度
将nvarchar(1000)转换为nvarchar(max)可能是一种解决方案。