字符串被神秘地切断了

Der*_*ler 4 .net c# oledb wpf localization

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

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

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

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

在运行时通过WPF检查器检查TextBlock时,它将以第二种语言显示剪切文本作为Text属性.

到目前为止,这对我来说毫无意义.但现在它变得更好了.

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

当一位同事找到"切断文本"问题的解决方案时,我真的很惊讶.他重新排序了Excel表格中的行.我不明白这是如何相关的,但在该文件的两个版本之间切换会对该问题产生影响.

And*_*rew 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个字符的值.要从备注列导入数据而不截断,必须确保至少一个采样行中的备注列包含长度超过255个字符的值,或者必须增加驱动程序采样的行数以包含此类行.您可以通过增加HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel注册表项下的TypeGuessRows的值来增加采样的行数.有关更多信息,请参阅PRB:从Jet 4.0 OLEDB源传输数据失败,错误.