在将事件存储到事件管理系统中时,我还存储了更改的历史记录。因为项目指定了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);问题是,我正在获取“支持说明”的历史记录,在之前和之后具有相同的值。我已经查看了关于string.equals生成错误返回的其他问题,并且我已经检查以确保之前和之后的字符串是相同的,并且它们是相同的。没有额外的空格、回车符或换行符。它们是二进制完全相同的。
那么,这是怎么回事?在我的历史记录中,如果值从A更改为B,但A和B是相同的,那么这条记录是如何结束的?
发布于 2017-04-08 15:31:05
这是因为字符串编码不同,尽管它们包含相同的字符,但它们并不相等。
如果您想比较这两个字符串,并且它们来自不同的来源,并且您不担心编码问题,那么使用string.Normalize()方法比较它们就可以了。
发布于 2017-04-11 00:29:41
因此,字符串确实是不同的。仔细的二进制比较显示,在字符串的一个版本中有回车符,而在另一个版本中没有。我不得不将数据直接从数据库中提取出来进行比较...
select hex(OldValue), hex(NewValue) from EventHistoryData where Id = 39645;这表明,在应该有新行的地方,字符串的一个版本具有新行的Windows实现(CarriageReturn + LineFeed = \r\n = x0D0A),而另一个版本具有新行的Unix实现(LifeFeed = \n = x0A)。在我的Windows IIS机器和Unix机器上的MySql服务器之间的某个地方,字符串的换行符正在转换为Unix实现。
最简单的解决方案是将比较更改为忽略回车符。由于Windows NewLine是\r \n,而Unix和Mac换行符是\n,因此比较字符串时最简单的做法是删除\r,将所有换行符转换为Unix版本。所以
if (!String.Equals(OldEventInfo.supportNotes, NewEventInfo.supportNotes))变成了
if (!String.Equals(OldEventInfo.supportNotes.Replace("\r",""), NewEventInfo.supportNotes.Replace("\r","")))https://stackoverflow.com/questions/43285152
复制相似问题