字符串被神秘地切断了

时间:2011-11-08 20:44:21

标签: c# .net wpf localization oledb

在我的应用程序中,我使用WpfLocalization在应用程序运行时提供翻译。该库基本上会维护一个属性列表及其分配的本地化关键字,并在更改活动语言时使用DependencyObject.SetValue()更新其值。

我注意到我的问题的情况是这样的:我有一个简单的TextBlock,并为其Text属性分配了一个本地化关键字。现在,当我的应用程序启动时,它会将初始值写入其中,它将在屏幕上显示正常。现在我切换语言并将新值设置为Text属性,但实际上只有一半的文本显示在屏幕上。来回切换语言没有任何影响。第一种语言总是显示正常,第二种语言被截断(在单词的中间,但总是完整的字符)。

两种语言之间的相对长度似乎与它没有任何关系。在我的测试用例中,工作语言字符串是498个字节,被切断的字符串是439个字节,在257个字节后被切断。

当我通过本地化代码更改其值之前检查所述Text的{​​{1}}属性的当前值时,它将始终具有任一语言的预期值(不会被截断)

在运行时通过WPF Inspector检查TextBlock时,它会将截止文本显示为第二语言的Text属性。

到目前为止,这对我来说毫无意义。但现在情况好转了。

原始WpfLocalization库从标准资源文件中读取本地化字符串,但我们使用的修改版本也可以从Excel文件中读取这些字符串。它通过使用Microsoft OLE DB驱动程序打开TextBlock并通过它读取字符串来实现。在调试器中,我可以看到所有的值都被读得很好。

当一位同事找到“切断文字”问题的修复程序时,我感到非常惊讶。他重新排序了Excel表格中的行。我不明白这是如何相关的,但在该文件的两个版本之间切换会对该问题产生影响。

1 个答案:

答案 0 :(得分:5)

这确实有意义,这是因为Excel的ole db驱动程序必须在列中获取数据样本以为其分配类型,在字符串的情况下,也是长度。如果它仅采样低于255个字符阈值的值,您将获得字符串(255)类型和截断文本,如果它已采样较长的字符串,则会将其指定为备注列并允许检索/存储更长的字符串。通过重新排序,您将更改采样的行。

如果您使用oledb将SQL Server读取到Excel,您会发现这是一个已知问题。 http://msdn.microsoft.com/en-us/library/ms141683.aspx - 由于您使用相同的ole db驱动程序,我希望情况也适用于您。

来自文档:

  

截断文字。   当驱动程序确定Excel列时   包含文本数据,驱动程序选择数据类型(字符串或备忘录)   基于它采样的最长值。如果司机没有   发现任何超过255个字符的值   样本,它将列视为255个字符的字符串列   备忘录栏目。因此,长度超过255个字符的值可能是   截断。要从备忘录列导入数据而不截断,您   必须确保备注栏中至少有一个采样   rows包含超过255个字符的值,或者您必须增加   驱动程序采样的行数,包括这样的行。您   可以通过增加值来增加采样的行数   TypeGuessRows下   HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel注册表   键。有关更多信息,请参阅PRB:从Jet 4.0传输数据   OLEDB源因错误而失败。