【发布时间】: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