我在尝试使用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。
答案 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
。