使用Linq2DB从sqlite表检索对象时出现InvalidCastException

时间:2015-11-25 12:21:15

标签: c# sqlite system.data.sqlite linq2db

我在尝试使用Linq2db + SQLite从Sqlite表中获取记录时遇到问题,这是我的下表

CREATE TABLE LogEntry 
(
Time DATETIME NOT NULL ON CONFLICT ROLLBACK DEFAULT (CURRENT_TIMESTAMP), 
Reference STRING NOT NULL ON CONFLICT ROLLBACK, 
Team STRING, 
Operator STRING, 
ETMachine STRING, 
CheckPoint BOOLEAN DEFAULT (0) NOT NULL
);

down是C#代码:

using (var db = new DataConnection())
  {
        var newItem = new LogEntry()
        {
          CheckPoint = false,
          ETMachine = "232323", // <= cause
          Operator = "asdasd",
          Reference = "asasas",
          Team = "wewe",
          Time = DateTime.Now
        };

        db.Insert<LogEntry>(newItem);

        foreach (var item in db.LogEntries) //<= error occurs here
        {
          MessageBox.Show(string.Format("{0}:{1}", item.ID, item.Time));
        }
}

和实体

    [Table("LogEntry")]
    public partial class LogEntry
  {
    [Column(Name = "ROWID"), NotNull, PrimaryKey, Identity] public int ID { get; set; } // datetime
    [Column, NotNull    ] public DateTime Time       { get; set; } // datetime
        [Column, NotNull    ] public string   Reference  { get; set; } // string(max)
        [Column,    Nullable] public string   Team       { get; set; } // string(max)
        [Column,    Nullable] public string   Operator   { get; set; } // string(max)
        [Column,    Nullable] public string   ETMachine  { get; set; } // string(max)
        [Column, NotNull    ] public bool     CheckPoint { get; set; } // boolean
    }

我得到了

'System.InvalidCastException' occurred in System.Data.SQLite.dll
Additional information: Specified cast is not valid.
@ System.Data.SQLite.SQLiteDataReader.VerifyType(Int32 i, DbType typ)
@ System.Data.SQLite.SQLiteDataReader.GetString(Int32 i)
@ lambda_method(Closure , IDataReader )
@ LinqToDB.Expressions.ConvertFromDataReaderExpression.ColumnReader.GetValue(IDataReader dataReader) dans i:\linq2db\Source\Expressions\ConvertFromDataReaderExpression.cs:ligne 128
@ lambda_method(Closure , QueryContext , IDataContext , IDataReader , Expression , Object[] )
@ LinqToDB.Linq.Query`1.<Map>d__6a.MoveNext() dans i:\linq2db\Source\Linq\Query.cs:ligne 1218
@ Peel.FrmMain.Testdb2() dans C:\Users\Administrateur\Documents\Work\Projects\PeeL\src\Peel\FrmMain.cs:ligne 67

我搜索了一下,发现当表格的字符串字段具有数值ex时,问题就会出现。上面的ETMachine属性,尽管该值以字符串文字形式传递。 在这里,如果我将232323更改为232a323,它将正常工作。

我的问题,如何强制Linq2db将值插入字符串而不是数字? 或者,如何强制Linq2DB将值作为适当的字段类型?

BTW目标框架是4.0。

1 个答案:

答案 0 :(得分:3)

我终于找到了问题,问题是在列数据类型STRING中,在我将其更改为TEXT后,它运行正常。

根据SQLite文档......

  

2.1柱亲和力的确定

     

列的亲和力由声明的列类型决定,按照以下规则显示:

     
      
  • 如果声明的类型包含字符串&#34; INT&#34;然后它被赋予INTEGER亲和力。
  •   
  • 如果声明的列类型包含任何字符串&#34; CHAR&#34;,&#34; CLOB&#34;或&#34; TEXT&#34;然后该列具有TEXT亲和力。注意   VARCHAR类型包含字符串&#34; CHAR&#34;并因此被分配   TEXT亲和力。
  •   
  • 如果列的声明类型包含字符串&#34; BLOB&#34;或者,如果未指定类型,则该列具有关联BLOB。
  •   
  • 如果列的声明类型包含任何字符串&#34; REAL&#34;,&#34; FLOA&#34;或&#34; DOUB&#34;然后该列具有REAL亲和力。
  •   
  • 否则,亲和力为NUMERIC。请注意,确定列关联性的规则的顺序很重要。一列其中   声明的类型是&#34; CHARINT&#34;将匹配规则1和2,但第一个   规则优先,因此列关联性将为INTEGER。
  •   

就我而言,string CHAR不包含NUMERIC,其类型为user.uid