使用类似搜索时出错
本文关键字:出错 搜索 | 更新日期: 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的值将失败,并出现字符串截断错误。对于可以接受的分配,但对于比较(尤其是对于LIKE
或SIMILAR 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");