2010-11-02 3 views
2

Je suis en train de déboguer une erreur de troncature intermittente dans mon application. L'erreur dans mes journaux ressemble à ceci:Débogage Erreur "Chaîne ou données binaires qui seraient tronquées" dans nHibernate

System.Data.SqlClient.SqlException: String or binary data would be truncated. 
The statement has been terminated. Generated: Tue, 02 Nov 2010 03:55:18 GMT 

NHibernate.Exceptions.GenericADOException: could not insert: 
[DataModel.Product][SQL: INSERT INTO [Product] (Fields) VALUES (?, ?,...); 
select SCOPE_IDENTITY()] ---> 
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) 

Notez que l'erreur ne fournit pas les valeurs des paramètres pour le sql qui a jeté l'erreur, que des espaces réservés: (?, ?,...). Y a-t-il un moyen de les obtenir de nHibernate? Quelque chose comme ceci:

try { 
    ... 
    Session.Flush(); // throws 
} 
catch (GenericADOException ex) { 

    // want to get the bad parameter values, 
    // so I can re-throw a more helpful exception 
} 

Répondre

1

Vous pouvez configurer log4net pour envoyer une sortie NH SQL quelque part. Exemple:

<log4net> 
    <appender name="Debug" type="log4net.Appender.DebugAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %message%newline" /> 
    </layout> 
    </appender> 
    <logger name="NHibernate.SQL"> 
    <level value="DEBUG"/> 
    <appender-ref ref="Debug"/> 
    </logger> 
</log4net> 

Dans ce cas, je l'envoie dans la fenêtre de débogage.

1

Vous pourriez être en mesure de forer vers le bas et savoir ce qu'il fait avec nHibernate Profiler.

2

Vous pouvez configurer un IPreInsertEventListener qui boucle les propriétés de la chaîne avant l'insertion, en vérifiant leur longueur.

Si l'une des propriétés est trop longue, vous pouvez consigner le nom de la propriété et sa valeur.

5

La plupart du temps, ce string or binary data truncated.... provient de Nhibernate exception Ado lorsque les données alimentées ont plus de caractères que la longueur du champ. par exemple. si un champ de table db est nvarchar(50), mais qu'un effort est fait pour insérer plus de 50 caractères, cette exception se produit. solution consiste à augmenter la longueur du champ Db de la table ou à réduire les caractères de données insérés.

Questions connexes