我在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类型列中收到错误:
算术异常,数字溢出或字符串截断字符串右截断
识别问题,我意识到字符串字段的大小超出了字段的限制。我不明白这一点,因为我在这些字段上映射了正确的长度限制。
按照我的代码:
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");
我该如何解决这个问题?它为什么会发生?
答案 0 :(得分:3)
如果我没弄错的话,.Where(c=> c.UF.Contains(uf)
会被翻译为WHERE c.UF LIKE ?
,参数的值为"%SP%"
,即4个字符。
问题在于Firebird描述并且只接受长度最大为字段声明长度的参数,即2个字符。因此,使用长度为4的值将失败,并出现字符串截断错误。对于可接受的作业,但为了进行比较(尤其是对于LIKE
或SIMILAR TO
),这非常令人讨厌。
正常的解决方法是将参数转换为更长的类型,但我不确定在使用实体框架时是否有办法执行此操作。唯一的其他解决方法是定义比数据严格必需的列更长的列。
相关的Firebird改进门票是:
答案 1 :(得分:0)
这很可能是与编码有关的问题。请尝试以下映射:
Property(t => t.UF)
.IsRequired()
.IsUnicode(false) // <---
.HasMaxLength(2)
.HasColumnType("Varchar")
.HasColumnName("CID_UF");
另一个选项(位于this answer中)是使用"AnsiString"
自定义类型:
Property(t => t.UF)
.IsRequired()
.CustomType("AnsiString") // <---
.HasMaxLength(2)
.HasColumnType("Varchar")
.HasColumnName("CID_UF");