2016-01-08 24 views
1

我有一個表在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類型字段的大小超出第l模仿該領域。我不明白這一點,因爲我在這些字段上映射了正確的長度限制。

跟隨我的代碼:

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"); 

我怎樣才能解決這個問題?爲什麼會發生?

+1

也許你應該爲你的焦炭領域從varchar改變列類型爲char,因爲這是他們實際上是。我不確定這是否是問題,但我會說這是一個很好的猜測。 – pquest

+0

我意識到這種改變,錯誤依然存在。 –

回答

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"); 
+0

我意識到這些更改,錯誤仍在繼續。 –

3

如果我沒有記錯的話,在.Where(c=> c.UF.Contains(uf)轉換爲WHERE c.UF LIKE ?,並且該參數值"%SP%",這是4個字符。

問題是,Firebird描述並且只接受長度達到聲明的字段長度的參數,這是2個字符。因此,使用長度爲4的值將失敗並出現字符串截斷錯誤。對於可以接受的分配,但是爲了比較(特別是對於LIKESIMILAR TO),這是非常煩人的。

正常的解決方法是將參數強制轉換爲更長的類型,但我不確定在使用實體框架時是否有辦法做到這一點。唯一的另一個解決方法是定義長於數據嚴格必需的列。

相關火鳥提高門票: