使用Linq2DB从sqlite表检索对象时出现InvalidCastException
本文关键字:InvalidCastException 对象 检索 Linq2DB sqlite 使用 | 更新日期: 2023-09-27 18:24:34
我在尝试使用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
我搜索了一下,发现当表的字符串字段具有数值(例如上面的ETMachine
属性)时,问题就会出现,尽管该值是以字符串文字的形式传递的。在这里,如果我将232323
更改为232a323
,它将正常工作。
我的问题是,如何强制Linq2db将值作为字符串而非数字插入?或者,我如何强制Linq2DB获取作为其适当字段类型的值?
BTW的目标框架是4.0。
我终于发现了问题,问题出现在列数据类型STRING
中,在我将其更改为TEXT
后,它运行良好。
根据SQLite文档。。。
2.1柱亲和性的测定
列的亲和性由列的声明类型决定,按照以下规则按顺序显示:
- 如果声明的类型包含字符串"INT",则为其分配INTEGER亲和性
- 如果声明的列类型包含任何字符串"CHAR"、"CLOB"或"TEXT",则该列具有TEXT相关性。注意类型VARCHAR包含字符串"CHAR",因此被赋值文本亲和性
- 如果列的声明类型包含字符串"BLOB",或者如果未指定类型,则该列具有相关性BLOB
- 如果列的声明类型包含任何字符串"REAL"、"FLOA"或"DOUB",则该列具有REAL相关性
- 否则,亲和性为NUMERIC。请注意,用于确定列相关性的规则的顺序很重要。一列声明的类型为"CHARINT"将同时匹配规则1和2,但第一个规则优先,所以列关联将是INTEGER
在我的情况下,它是不包含CHAR
的string
,那么类型是NUMERIC
。