插入/更新时文本被截断

本文关键字:文本 更新 插入 | 更新日期: 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);

本文将更详细地描述该解决方案。