【发布时间】:2017-04-07 18:46:24
【问题描述】:
在将事件存储到事件管理系统中时,我还存储了更改的历史记录。因为项目指定使用 MySql,而 MySql 触发器有一些不足之处,所以我使用实际代码来检测更改。我有以下代码行来查看支持备注字段是否更改,并相应地添加历史记录:
....
if (!String.Equals(OldEventInfo.supportNotes, NewEventInfo.supportNotes))
{ ChangesMade.Add(new EventHistoryDataItem("support notes", OldEventInfo.supportNotes, NewEventInfo.supportNotes)); }
....
EventsDataset eds = new EventsDataset();
EventsDatasetTableAdapters.eventhistoryTableAdapter ehta = new EventsDatasetTableAdapters.eventhistoryTableAdapter();
EventsDatasetTableAdapters.eventhistorydataTableAdapter ehdta = new EventsDatasetTableAdapters.eventhistorydataTableAdapter();
Int64 HistoryId = Convert.ToInt64(ehta.InsertQuery(NewEventInfo.id.Value, DateTime.Now, UserId));
eds.eventhistorydata.Clear();
foreach (EventHistoryDataItem thisChange in ChangesMade)
{
EventsDataset.eventhistorydataRow newRow = (EventsDataset.eventhistorydataRow)eds.eventhistorydata.NewRow();
newRow.eventHistoryId = HistoryId;
newRow.field = thisChange.Field;
newRow.oldValue = thisChange.OldValue;
newRow.newValue = thisChange.NewValue;
eds.eventhistorydata.AddeventhistorydataRow(newRow);
}
ehdta.Update(eds.eventhistorydata);
问题是我得到的“支持说明”的历史记录在前后具有相同的值。我已经查看了关于 SO 的其他关于 string.equals 生成错误返回的问题,并且我已经检查以确保之前和之后的字符串是相同的,并且它们是相同的。没有多余的空格或回车或换行符。它们是二进制相同的。
那么,什么给了?在我的历史记录中,值已从 A 更改为 B,但 A 和 B 相同的记录是如何结束的?
【问题讨论】:
-
我知道你说没有空格或回车。但空格和回车并不是唯一无法呈现的字符。还有许多编辑无法渲染的字符。确认没有多余字符的一种方法是包含长度测试:
if( OldEventInfo.supportNotes.Length != NewEventInfo.supportNotes.Length && !String.Equals(OldEventInfo.supportNotes, NewEventInfo.supportNotes)) { ... } -
如果它们是二进制相同的,那么它们的 GetHashCode() 应该返回相同的值。如果不是,那么无论出于何种原因,它们都不相等(例如行尾不同或沿着这些行)。
-
@StephenPorter - 事实证明,你是对的,这意味着我撒了谎。我回去仔细看了一下,果然琴弦不一样。在数据进入 Unix 服务器上的 MySql 和返回之间的某个地方,Windows 换行符(回车 + 换行符 - 0D0A)变成了 Unix 换行符(换行符 - 0A)。这导致字符串测试不相等。
-
我可能会在稍后删除这个问题。原来是stackoverflow.com/q/25999031/4843530的副本
-
@AgapwIesu 很好,很高兴你明白了 :) 当我开始使用 .NET Core 时,我遇到了这个问题,因为我在 Windows 中开发、Docker 化我的应用程序并部署到 Linux 服务器。你遇到了行尾和路径问题哈哈。