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 会返回一个异常(“对象引用未设置为对象的实例”),但有趣的是,< strong> _DsAttribute 与我的机器为英语(美国英语)时的数据相同。此外,当我搜索 DtgFields.Rows(e.RowIndex)。细胞(“属性ID”)。值的值时,我可以在 _DsAttribute 的数据中找到它。 ID的数据至少在肉眼看来是相同的。
如何利用CultureInfo来避免这类问题?
答案 0 :(得分:2)
这在技术上可能,丹麦语使用与美国英语不同的排序顺序。你会在丹麦电话簿的开头找到Åårdvårk先生,而不是像美国那样。
如果Find()方法使用二进制搜索或树来定位数据,那么字符串比较会成为一个危险的命题。对于DataSet来说肯定是这种情况,其主键索引是红黑树。出现问题的是,当索引用丹麦语作为校对编写时,算法遵循树下的错误路径,但是以英语作为校对读取。或者相反。结果是它无法在树中找到条目,即使它存在。
反对指示是Guid类型的dbase列永远不应该是一个字符串,尽管它并不罕见。并且Guid值不应包含可以引导搜索错误的字符。也许列不干净并包含其他非guid值。您可以通过更改列类型或一致地使用相同的归类顺序(即语言)来修复它。尝试使用CultureInfo.CurrentCulture进行快速修复。
答案 1 :(得分: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")
以上是我的解决方案。汉斯的答案有很多非常有用的技术信息(因此我的支持)并引导我回答。