插入/更新时文本被截断
本文关键字:文本 更新 插入 | 更新日期: 2023-09-27 18:00:55
我有一个.NET Web Forms应用程序。它引用WCF服务,这些服务使用NHibernate来处理数据访问。后端是SQL Server。
在表a中,我有一个可以为null的列"Notes"varchar(MAX(如果我理解正确,这个栏应该可以容纳2^28个字符。
我今天刚接到一个用户的电话,说当她在我的应用程序中单击"保存"时,她的笔记被截断了。我能够重现这个问题。到目前为止,她已经在该字段中输入了3960个字符,还有2个句子要添加。她输入它们,点击"保存",在她刚刚添加的两句话中,TextArea中只剩下32个字符。
我一直在遍历我的代码,试图找到这些数据被截断的地方。我不知所措。我一路走到了_session.SaveOrUpdate(item(;调用。我在对SaveOrUpdate((的调用上设置了一个断点,并查看了对象的Notes属性。整根绳子还在那儿。我按F5继续,没有出现异常。我的笔记在web应用程序中被截断了。我查看了数据库中的记录,Notes被截断了。它们总是在同一位置被截断,就像我达到了字符限制一样。
public void Update(T item)
{
try
{
_session.BeginTransaction();
_session.SaveOrUpdate(item);
_session.Transaction.Commit();
}
catch (Exception)
{
_session.Transaction.Rollback();
throw;
}
}
我也试过:
public void Update(T item)
{
try
{
_session.BeginTransaction();
_session.Update(item);
_session.Transaction.Commit();
}
catch (Exception)
{
_session.Transaction.Rollback();
throw;
}
}
曲线球:在SSMS中,我可以编写一个UPDATE语句,并将要插入的整个notes字符串分配给"notes"字段。在执行UPDATE语句之后,我的整个notes字符串都在TableA的"notes"字段中。
有什么想法吗?当我通过web应用程序插入/更新时,为什么我的数据会被截断?
更新:
我运行了SQL事件探查器,发现我的Notes字符串在UPDATE语句中被截断了。
我导出了我的NHibernate映射,这样我就可以看到生成了什么:
<property name="Notes" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Notes" />
</property>
帮助不大。接下来我将研究与NHibernate相关的建议。
再次更新:谢谢冰人和彼得·格鲁克把我带向正确的方向。我将列更改为nvarchar(max(,并修改了我的NHibernate映射
Map(x => x.Notes)
.Length(4001);
我现在可以通过网络应用程序添加我的用户试图添加的所有笔记。我需要再测试一些解决方案,但我有足够的信心将这个问题标记为"已回答"。
当使用Fluent NHibernate进行映射时,我使用以下语法来定义NVARCHAR(MAX)
列:
const int NVarCharMax = 4001; // force NHibernate to allocate max length for nvarchar data
Map(x => x.ColumnName).Length(NVarCharMax);
本文将更详细地描述该解决方案。