使用类似搜索时出错

本文关键字:出错 搜索 | 更新日期: 2023-09-27 18:29:35

我在Firebird数据库中有一个表

CREATE TABLE CIDADE (
CID_CD              SMALLINT NOT NULL,
CID_DS              CHAR(20) NOT NULL,
CID_UF              CHAR(2) NOT NULL,
CID_DISTANCIA_SEDE  SMALLINT NOT NULL,
CID_CD_ALTERNATIVO  INTEGER NOT NULL,
CID_DT_LK           DATE NOT NULL);

我正在使用LINQ对表列进行查询,并且在CHAR类型列中得到错误:

算术异常、数字溢出或字符串截断字符串右截断

识别出这个问题后,我意识到类型String字段的大小超出了字段的限制。我不理解这一点,因为我在这些字段上映射了正确的长度约束。

遵循我的代码:

public IQueryable<Cidade> Pesquisar(Cidade cidade)
{
    string uf = cidade.UF; // "SP" for example
    var query = pctxContexto.Cidade.Where(c=> c.UF.Contains(uf));
    return query;
}

映射:

// Table Mapping
ToTable("CIDADE");
//Chave primária
HasKey(t => new { t.Codigo });
//Propriedades
Property(t => t.Codigo).HasColumnName("CID_CD");
Property(t => t.Descricao)
    .IsRequired()
    .HasMaxLength(20)
    .HasColumnType("Char")
    .HasColumnName("CID_DS");
Property(t => t.UF)
    .IsRequired()
    .HasMaxLength(2)
    .HasColumnType("Char")
    .HasColumnName("CID_UF");
Property(t => t.DistanciaSede)
    .IsRequired()
    .HasColumnType("Smallint")
    .HasColumnName("CID_DISTANCIA_SEDE");
Property(t => t.Codigo_Alternativo)
    .IsRequired()
    .HasColumnType("Int")
    .HasColumnName("CID_CD_ALTERNATIVO");

我该如何解决这个问题?为什么会发生这种情况?

使用类似搜索时出错

如果我没有弄错,.Where(c=> c.UF.Contains(uf)将转换为WHERE c.UF LIKE ?,参数的值为"%SP%",即4个字符。

问题是,Firebird描述并只接受长度不超过字段声明长度(即2个字符)的参数。因此,使用长度为4的值将失败,并出现字符串截断错误。对于可以接受的分配,但对于比较(尤其是对于LIKESIMILAR TO),这是非常令人讨厌的。

通常的解决方法是将参数强制转换为更长的类型,但我不确定在使用实体框架时是否有这样的方法。唯一的其他解决方法是定义比数据所需长度更长的列。

相关的火鸟改进票有:

  • 芯-251
  • 芯-3559

这很可能是一个与编码有关的问题。尝试以下映射:

Property(t => t.UF)
    .IsRequired()
    .IsUnicode(false)            // <--- 
    .HasMaxLength(2)
    .HasColumnType("Varchar")
    .HasColumnName("CID_UF");

另一个选项(在这个答案中找到)是使用"AnsiString"自定义类型:

Property(t => t.UF)
    .IsRequired()
    .CustomType("AnsiString")    // <--- 
    .HasMaxLength(2)
    .HasColumnType("Varchar")
    .HasColumnName("CID_UF");