【问题标题】:Text is getting truncated on insert/update插入/更新时文本被截断
【发布时间】:2014-04-30 19:27:50
【问题描述】:

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

在 TableA 中,我有一个可为空的列“Notes”varchar(MAX) 如果我理解正确的话,这个专栏应该可以容纳 2^28 个字符。

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

我一直在单步执行我的代码,试图找出这些数据被截断的位置。我不知所措。我一直走到 _session.SaveOrUpdate(item);调用存储库。我在调用 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 语句并将我要插入的整个注释字符串分配给“注释”字段。执行该 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);

我现在可以通过网络应用程序添加我的用户尝试添加的所有注释。我需要再测试一下解决方案,但我有足够的信心将此问题标记为“已回答”。

【问题讨论】:

  • 您是否尝试过在代码中运行 Update 方法时运行 SQL 分析器?
  • 您是否尝试过使用日志记录或 Fiddler 来查看 WCF 服务接收到的内容,或者使用 SQL Server Profiler 来查看 DBMS 获取的内容?
  • 我认为 NHibernate 有一个错误处理 VARCHAR(MAX)。查看this page 了解更多信息。好消息是NVARCHAR(MAX) 似乎可以正常工作,所以不妨尝试一下?
  • 好的,我刚刚运行了 SQL 分析器(我一直忘记那个工具,我很少遇到这样的问题)。注释字符串在 Profiler 的 UPDATE 语句中被截断。所以现在我认为 NHibernate 是问题所在。

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


【解决方案1】:

在使用 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2013-05-26
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多