1
Dim ii = _DsAttribute.Tables(0).Rows.Find(Convert.ToString(DtgFields.Rows(e.RowIndex).Cells("AttributeID").Value, CultureInfo.CreateSpecificCulture("en-US")))  '.ToString.ToString(CultureInfo.InvariantCulture))
Dim jj = _DsAttribute.Tables(0).Rows.Find(Convert.ToString(DtgFields.Rows(e.RowIndex).Cells("AttributeID").Value, CultureInfo.CreateSpecificCulture("en-US"))).Item("Checked")

我尝试了上述的许多变体,试图防止数据库的数据被我机器的丹麦文化(在 Windows 中的区域/语言设置中设置)“损坏”。我尝试了不变的文化,fr-FR 和 en-US。

当我的机器是丹麦机器时,ii等于 null 并且jj返回异常(“对象引用未设置为对象的实例”),但有趣的是,_DsAttribute具有与我的机器是英语(美国英语)时相同的数据。此外,当我搜索DtgFields.Rows(e.RowIndex).Cells("AttributeID").Value的值时,我可以在_DsAttribute的数据中找到它。至少在肉眼看来,ID 的数据是相同的。

如何使用 CultureInfo 来避免此类问题?

4

2 回答 2

2

这在技术上是可行的,丹麦语使用与美国英语不同的排序顺序。在丹麦,您会在电话簿的开头找到 Åårdvårk 先生,而不是在美国的末尾。

如果 Find() 方法使用二分搜索或树来定位数据,这会使字符串比较成为一个危险的命题。DataSet 肯定是这样,它的主键索引是一棵红黑树。问题在于,当索引以丹麦语作为排序规则编写但以英语作为排序规则读取时,算法沿着树的错误路径向下移动。或者反过来。结果是它在树中找不到条目,​​即使它存在。

禁忌症是 Guid 类型的 dbase 列不应该是字符串,尽管它并不少见。并且 Guid 值不应包含可能导致搜索错误的字符。也许该列不干净并且包含其他非指导值。您可以通过更改列类型或始终使用相同的排序规则(即语言)来修复它。尝试 CultureInfo.CurrentCulture 以获得可能的快速修复。

于 2012-12-04T16:58:29.593 回答
0
Dim ii = _DsAttribute.Tables(0).Rows.Find(New Guid(DtgFields.Rows(e.RowIndex).Cells("AttributeID").Value.ToString))
Dim jj = _DsAttribute.Tables(0).Rows.Find(New Guid(DtgFields.Rows(e.RowIndex).Cells("AttributeID").Value.ToString)).Item("Checked")

以上是我的解决方案。汉斯的回答有很多非常有用的技术信息(因此我赞成)并引导我回答。

于 2012-12-05T09:35:42.133 回答