【问题标题】:ServiceStack ORMLite encoding issue after upgrade升级后的 ServiceStack ORMLite 编码问题
【发布时间】:2018-03-01 00:04:42
【问题描述】:

我们刚刚将一些软件从 ServiceStack 4.0.62 升级到了 ServiceStack 5.0.0.0。

由于某种原因,ormlite 的编码管理似乎发生了变化。

使用包含特殊字符(例如 Ø ← ↑ → ↓ ↔ ↕~ Σ ∂ φ)的字符串字段简单地保存 DTO 的代码,过去在 4.0.62 中可以使用,现在可以保存 ?在数据库中。

是否有任何可能导致重大变化的变化。我们没有更改保存代码,保存前的断点清楚地显示了正确的字符。

这基本上是我们正在执行的代码:

DB.Save<DTOType>(dtoInstance)

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

    我正在浏览 ServiceStack ORMlite 代码并发现了这一点:

    OrmLiteConfig.DialectProvider.GetStringConverter().UseUnicode;

    所以我尝试了那个调用

    OrmLiteConfig.DialectProvider.GetStringConverter(); 
    

    就在 DB.Save 调用返回 false 之前,这可以解释问题,因为这会将 dbCmd 设置为使用 VARCHAR 而不是 NVARCHAR

    我设置了

     var stringConverter = OrmLiteConfig.DialectProvider.GetStringConverter();
     stringConverter.UseUnicode = true; 
    

    在 AppHost 初始配置中并解决了该问题。

    显然我无法正确阅读此处描述的文档

    https://github.com/ServiceStack/ServiceStack.OrmLite/wiki/OrmLite-Type-Converters

    【讨论】:

      【解决方案2】:

      可能影响此的主要更改是切换到paramaterized queries in v4.0.60。 OrmLite 通常本身不会对普通字符串属性进行任何编码,即它只是将字符串值传递给 ADO.NET DB 参数。

      它转换字符串值的主要时间是serializes complex types into blobs

      问题可能最终在于使用 ADO .NET 提供程序的升级版本。

      【讨论】:

      • 嗯,我们升级的版本是4.0.6.2。高于 4.0.6.0。而且我不确定您所说的“问题可能最终会使用 ado.net 提供程序的升级版本”是什么意思
      • @scoob 我看到了,但我不知道任何其他影响行为的更改,因为字符串值用于幕后的参数化查询。
      • 我找到了答案,看我的另一个答案。也许这种行为在 4.062 到 5.0.0.0 之间发生了变化,我不知道。一个建议是轻松获取过去 ServiceStack 版本的完整文档状态。 ServiceStack 变化很快,并不是每个人都更新到最新版本,而且由于文档反映的是最新版本,如果您使用的是旧版本,可能会让人感到困惑。
      • @scoob 发布更新文档可在 docs.servicestack.net/releasesdocs.servicestack.net/release-notes-history 上获取旧版本
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多