c# - 字符串被神秘地切断

标签 c# .net wpf localization oledb

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

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

这两种语言的相对长度似乎没有任何关系。在我的测试用例中,工作语言字符串为 498 字节,被截断的字符串为 439 字节,在 257 字节后被截断)。

当我在通过本地化代码更改其值之前检查所述 TextBlockText 属性的当前值时,它将始终具有预期值(不是截断)在任何一种语言中。

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

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

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

现在,当一位同事找到解决“截断文本”问题的方法时,我真的很惊讶。他重新排列了 Excel 工作表中的行。我看不出这有什么关系,但是在该文件的两个版本之间切换会对问题产生影响。

最佳答案

这确实有道理,因为 Excel 的 ole db 驱动程序必须对列中的数据进行采样以为其分配类型,如果是字符串,还需要分配长度。如果它仅对低于 255 个字符阈值的值进行采样,您将获得 string(255) 类型和截断的文本,如果它对更长的字符串进行采样,它会将其分配为备注列并允许检索/存储更长的字符串。通过重新排序,您正在更改采样的行。

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

来自文档:

Truncated text. When the driver determines that an Excel column contains text data, the driver selects the data type (string or memo) based on the longest value that it samples. If the driver does not discover any values longer than 255 characters in the rows that it samples, it treats the column as a 255-character string column instead of a memo column. Therefore, values longer than 255 characters may be truncated. To import data from a memo column without truncation, you must make sure that the memo column in at least one of the sampled rows contains a value longer than 255 characters, or you must increase the number of rows sampled by the driver to include such a row. You can increase the number of rows sampled by increasing the value of TypeGuessRows under the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel registry key. For more information, see PRB: Transfer of Data from Jet 4.0 OLEDB Source Fails w/ Error.

关于c# - 字符串被神秘地切断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8056847/

相关文章:

c# - session 正在跨 Controller 的 RedirectToAction 上重置

c# - 初级/入门级及其 super 是否有任何命名约定?

c# - 在 C# 中序列化文本与在 JS 中完成的方式相同

wpf - 是否对各种 XAML 方言之间的差异有一个很好的概述

c# - 将 JPEG 图像转换为字节数组 - COM 异常

c# - 合并 .cshtml 文件时 Visual Studio 2015 Update 2 崩溃

c# - 将字符串拆分为相邻 char 值不同的段

.net - 在将 SOAP 消息发送到 .NET 中的 WebService 之前获取它

c# - 汇编成字节

wpf - 文本框和RichTextbox WPF之间的区别?