[英]InvalidCastException when retrieving object from sqlite table using 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
);
下面是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。
我终于找到了问题,问题出在列数据类型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。
在我的情况下,它是不包含CHAR
的string
,则类型为NUMERIC
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.