我很难找到有关各种.NET数据类型的System.Data.SQLite行为的文档.
例如,System.Data.SQLite如何在SQLite数据库中存储.NET Booleans?有几种可能的方法:
>整数0和1
>整数0和-1
>文字’真’和’假’
>文字’T’和’F’
>文字’Y’和’N’
>等……
反之亦然 – Booleans如何从SQLite中解析出来? System.Data.SQLite是否期望某种格式?那格式是什么?
缺乏关于此的文档是令人沮丧的.也许我不是在寻找合适的地方?
注意:这不是专门针对布尔人的问题.我正在寻找解释所有.NET数据类型行为的文档.
最佳答案 我建议你从驱动程序不可知的
SQLite documentation on the subject开始.它解释了应该存储布尔值的方式,以及不同的日期时间序列化方案.
有关更多详细信息,System.Data.SQLite是开源的,虽然在某些边缘有点狡猾,但通常很容易阅读.
例如,SQLiteDataReader.cs中的GetValue()方法(已实现的ADO.NET IDataReader接口的一部分)调用名为GetSQLiteType()的方法,然后根据某些连接标志执行更多自动检测.
GetSQLiteType()和朋友们都返回到SQLiteConvert类,它执行实际的类型转换和检测.转换都是在那里定义的(在大量日期操作助手之后开始大约一半).最终,您达到的功能与您的问题特别相关:
internal static TypeAffinity TypeToAffinity(Type typ)
{
TypeCode tc = Type.GetTypeCode(typ);
if (tc == TypeCode.Object)
{
if (typ == typeof(byte[]) || typ == typeof(Guid))
return TypeAffinity.Blob;
else
return TypeAffinity.Text;
}
return _typecodeAffinities[(int)tc];
}
private static TypeAffinity[] _typecodeAffinities = {
TypeAffinity.Null, // Empty (0)
TypeAffinity.Blob, // Object (1)
TypeAffinity.Null, // DBNull (2)
TypeAffinity.Int64, // Boolean (3)
TypeAffinity.Int64, // Char (4)
TypeAffinity.Int64, // SByte (5)
TypeAffinity.Int64, // Byte (6)
TypeAffinity.Int64, // Int16 (7)
TypeAffinity.Int64, // UInt16 (8)
TypeAffinity.Int64, // Int32 (9)
TypeAffinity.Int64, // UInt32 (10)
TypeAffinity.Int64, // Int64 (11)
TypeAffinity.Int64, // UInt64 (12)
TypeAffinity.Double, // Single (13)
TypeAffinity.Double, // Double (14)
TypeAffinity.Double, // Decimal (15)
TypeAffinity.DateTime, // DateTime (16)
TypeAffinity.Null, // ?? (17)
TypeAffinity.Text // String (18)
};
通常,整数类型将正确映射到SQLite(64位)整数并返回,并且同样适用于字符串. byte []数组和Guids也可以透明地工作,尽管两者都存储为blob.布尔值映射到1(真)和0(假)整数.并支持所有SQLite日期时间表示,以及更多:请参阅SQLite3.cs中的Bind_DateTime()方法.