C# 文本在插入/更新时被截断

C# 文本在插入/更新时被截断,c#,asp.net,sql-server-2008,fluent-nhibernate,C#,Asp.net,Sql Server 2008,Fluent Nhibernate,我有一个.NET Web表单应用程序。它引用使用NHibernate的WCF服务来处理数据访问。后端是SQL Server 在表a中,我有一个可为空的列“Notes”varchar(MAX) 如果我理解正确,此列应能容纳2^28个字符 我今天刚接到一个用户的电话,说当她在我的应用程序中单击“保存”时,她的笔记被截断了。我能够复制这个问题。到目前为止,她已经在该字段中输入了3960个字符,还有两个句子需要添加。她输入它们,点击“保存”,在她刚刚添加的两句话中,文本区只剩下32个字符 我一直在逐步检

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

在表a中,我有一个可为空的列“Notes”varchar(MAX) 如果我理解正确,此列应能容纳2^28个字符

我今天刚接到一个用户的电话,说当她在我的应用程序中单击“保存”时,她的笔记被截断了。我能够复制这个问题。到目前为止,她已经在该字段中输入了3960个字符,还有两个句子需要添加。她输入它们,点击“保存”,在她刚刚添加的两句话中,文本区只剩下32个字符

我一直在逐步检查我的代码,试图找到这些数据被截断的地方。我不知所措。我一路走到_session.SaveOrUpdate(项目);调用存储库。我在调用SaveOrUpdate()时设置了一个断点,并查看了对象的Notes属性。整根绳子还在那里。我按F5继续,没有抛出异常。我的笔记在web应用程序中被截断。我查看了数据库中的记录,笔记被截断了。它们总是在相同的位置被截断,就像我达到了角色限制一样

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字符串都在表A的“notes”字段中

知道我通过web应用程序插入/更新数据时数据被截断的原因吗

更新:

我运行了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>

我现在可以通过web应用程序添加我的用户试图添加的所有注释。我需要进一步测试分辨率,但我有足够的信心将这个问题标记为“已回答”。

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

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

在从代码运行
Update
方法时,您是否尝试过运行SQL profiler?您是否尝试过使用日志记录或Fiddler查看WCF服务接收到的内容,或者使用SQL Server profiler查看DBMS得到的内容?我认为NHibernate在处理
VARCHAR(MAX)
时存在错误。有关更多信息,请参阅。好消息是,
NVARCHAR(MAX)
似乎可以正常工作,所以也许可以尝试一下吗?好的,我刚刚运行了SQL profiler(我一直忘了这个工具,我很少遇到这样的问题)。notes字符串在探查器中的UPDATE语句中被截断。所以现在我认为NHibernate是个问题。
const int NVarCharMax = 4001;  // force NHibernate to allocate max length for nvarchar data  
Map(x => x.ColumnName).Length(NVarCharMax);