当文化设置为"丹麦语时,表中的GUID查找失败。

时间:2012-12-04 16:36:58

标签: vb.net cultureinfo

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来避免这类问题?

2 个答案:

答案 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")

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