【问题标题】:EF Core encoding with Firebird 2.5Firebird 2.5 的 EF Core 编码
【发布时间】:2020-09-01 19:07:24
【问题描述】:

我正在将使用 Delphi + FireDac 制作的旧系统迁移到 C# + EF。由于它是一个遗留系统,因此已经有一个包含许多记录的数据库(许多记录没有编码信息)。

当我使用 C# + EF 获取包含特殊字符的记录时,字符显示不正确。

我该如何解决这个问题?

C#

德尔福

MainWindow.xaml.cs - ButtonClick

private void Button_Click(object sender, RoutedEventArgs e)
{
    string appPath = AppContext.BaseDirectory;
    string connectionString = $"database=localhost/3050:{appPath}\\database\\test.fdb;user=sysdba;password=masterkey";          
    using (AppDbContext con = new AppDbContext(connectionString))
    {
        Product p = con.Products.First();
        lblText.Text = p.Name;                
    }
}

AppDbContext.cs

public class AppDbContext : DbContext
{
    private readonly string _connectionString;
    public DbSet<Product> Products { get; set; }

    public AppDbContext(string connectionString)
    {
        _connectionString = connectionString;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);

        optionsBuilder.UseFirebird(_connectionString);
    }
}

Product.cs

[Table("PRODUCTS")]
public class Product
{
    [Column("ID")]
    public int Id { get; set; }
    [Column("NAME")]
    public string Name { get; set; }
}

Complete C# project code

【问题讨论】:

    标签: c# delphi .net-core entity-framework-core firebird


    【解决方案1】:

    对于 firebird,大多数情况下,特殊字符的问题可以使用 CharSet UTF-8 来处理。在connectionString 中,您可能需要包含charset=utf8

    添加更新:

    感谢@Felipe Godinho 的反馈,似乎charset=win1252 已被发现是CharSet 的另一个有价值的选项,在处理在Firebird 上运行的遗留数据库系统时值得一试。

    【讨论】:

    • 我已经尝试通过 charset=utf8 ,但问题仍然存在。我尝试使用 charset=win1252 并解决了问题。非常感谢。
    • @FelipeGodinho Delphi 在 2009 年之前(非 Unicode)使用 ANSI-xxxx Windows 代码页(MBCS,每个字母通常是一个字节或更多)字符串。 int GetACP(void) Win32 API 函数。自 2009 年以来,Delphi 在内部使用 UTF-16 字符串,就像 Java 和 C# 一样。由于您引用 FireDAC 而不是 AnyDAC - 您使用的是 2015 或更高版本的某些 Delphi 版本。即使那样,即使数据库本身没有字符集 - 那么字符集也可能在列定义本身中。最重要的是,连接可能有它。 Personalyl 我会使用类似 fbprofiler.sf.net 的东西并检查从 Delphi 应用程序到 FB srv 的连接顺序
    • charset=utf8 and yet the problem continued. I tried with charset=win1252 这个 OTOH 确实看起来文本字段存储为原始二进制文件。但是,您是否绝对确定您的 Windows 将 1252 作为默认 ANSI 代码页,而不是 1250 或其他?它可以在注册表中检查,可能在某些控制面板中(不确定),或者从 Delphi(对于新的图形 VCL 应用程序,您只需要创建主窗体 OnShow 事件处理程序并将 ShowMessage('Code Page is ' + IntToStr(GetACP())); 命令放在那里)。
    • 无论如何,它仍然非常脆弱。正确的方法是将数据库的所有schema(元数据,声明部分)转储到 SQL 脚本中,然后更改脚本以显式声明字符集(UTF8 或 Win1252 或任何内容)和排序规则,然后创建新数据库和从旧到新“抽取”数据(几十年前有 IBDataPump 工具,今天可能还有其他类似的工具,或者您可以自己做,如果对所有表进行排序以查找依赖项)。这种“我们的意思是原始二进制字段中的 cp1251 文本”的隐含要求仍然是等待爆炸的隐藏地雷。
    • 有一天有人会告诉你“我们给了你钱来编写新的非传统应用程序,现在你必须在一夜之间支持所有非欧洲字母”,你必须将数据库转换为无论如何,明确的 UTF8 :-) 此外,也许 DB 转换和修复 Delphi FireDAC 字符集属性也会使应用程序的遗留问题有所减少:-D
    猜你喜欢
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多