在Windows CE的CF 3.5中如何正确获取SQLite REAL列的对应类型?
我之前在Windows CE平台用.NET Compact Framework 3.5搭配SQLite.Interop.066.DLL做数据库操作时,也踩过REAL列类型适配的坑,给你几个亲测有效的处理方式:
优先用
Double类型映射REAL列
SQLite的REAL类型本质是8字节的双精度浮点数,和.NET里的Double类型完全匹配,而Float是4字节单精度,类型不匹配就会导致读取失败。读取数据时直接用SqliteDataReader.GetDouble(int ordinal)方法,实体类里对应的属性也定义为Double类型,示例代码:// 读取示例 using (var reader = command.ExecuteReader()) { while (reader.Read()) { double realValue = reader.GetDouble(0); // 对应REAL列的索引 // 后续处理 } }如果需要Decimal类型,手动转换处理
SQLite没有原生的Decimal类型,REAL存储的是浮点数近似值,所以可以先读取为Double再转换为Decimal,写入时则把Decimal转成Double存入:// 读取转Decimal decimal decimalValue = Convert.ToDecimal(reader.GetDouble(0)); // 写入时转Double command.Parameters.AddWithValue("@realColumn", Convert.ToDouble(decimalValue));注意:如果你的业务对精度要求极高,这种转换可能会有微小误差,必要时可以考虑把数值以字符串形式存入TEXT列,再转换为Decimal,但性能会稍差。
明确指定类型读取,避免自动转换
.NET Compact Framework在Windows CE上的类型自动转换机制比较有限,尽量不要用reader.GetValue(index)后强制转换,而是直接调用对应类型的GetXXX方法,这样能避免很多隐式转换带来的异常。确认SQLite.Interop库的平台兼容性
你用的SQLite.Interop.066.DLL版本比较老,要确保它是针对Windows CE平台编译的(比如ARM架构版本),如果用了桌面版的interop库,也会出现类型读取异常的问题。
内容的提问来源于stack exchange,提问作者Camadas

