【问题标题】:InvalidCastException when retrieving object from sqlite table using Linq2DB使用 Linq2DB 从 sqlite 表中检索对象时出现 InvalidCastException
【发布时间】:2015-11-25 12:21:14
【问题描述】:

我在尝试使用 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
);

下面是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。

【问题讨论】:

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


    【解决方案1】:

    我终于找到了问题,问题出在列数据类型STRING,我将其更改为TEXT后它工作正常。

    根据 SQLite 文档...

    2.1 柱亲和性的测定

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

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

    在我的情况下,它是 string,它不包含 CHAR,那么类型是 NUMERIC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2013-05-27
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多