插入/更新时文本被截断

时间:2014-04-30 19:27:51

标签: c# asp.net sql-server-2008 fluent-nhibernate

我有一个.NET Web Forms应用程序。它引用了使用NHibernate的WCF服务来处理数据访问。后端是SQL Server。

在TableA中,我有一个可为空的列“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”字段。执行该UPDATE语句后,我的整个注释字符串位于TableA的“注释”字段中。

当我通过我的网络应用程序插入/更新时,为什么我的数据会被截断?

更新

我运行了SQL Profiler,发现我的Notes字符串在UPDATE语句中被截断了。

我导出了我的NHibernate映射,所以我可以看到生成的内容:

<property name="Notes" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <column name="Notes" />
</property>

不是很有帮助。接下来我将研究NHibernate的相关建议。

再次更新: 谢谢icemanind和Peter Gluck带领我走向正确的方向。我将列更改为nvarchar(max)并修改了我的NHibernate映射

Map(x => x.Notes)
    .Length(4001);

我现在可以通过网络应用添加我的用户试图添加的所有笔记。我需要更多地测试分辨率,但我有足够的信心将这个问题标记为“已回答”。

1 个答案:

答案 0 :(得分:2)

在使用Fluent NHibernate进行映射时,我使用以下语法定义NVARCHAR(MAX)列:

const int NVarCharMax = 4001;  // force NHibernate to allocate max length for nvarchar data  
Map(x => x.ColumnName).Length(NVarCharMax);

This article describes the solution in more detail.