System.Data.SQLite 如何处理 .NET 数据类型?
How does System.Data.SQLite deal with .NET Data Types?
我正在努力寻找有关 System.Data.SQLite 在各种 .NET 数据类型方面的行为的文档。
例如,System.Data.SQLite 如何在 SQLite 数据库中存储 .NET 布尔值?有几种可能的方法:
- 整数 0 和 1
- 整数 0 和 –1
- 文本 'True' 和 'False'
- 文本 'T' 和 'F'
- 文本 'Y' 和 'N'
- 等...
反之亦然——布尔值是如何从 SQLite 中解析出来的? System.Data.SQLite 是否需要某种格式?那是什么格式?
缺乏这方面的文档令人沮丧。也许我没找对地方?
注意: 这不是专门针对布尔值的问题。我正在寻找解释所有 .NET 数据类型的行为的文档 。
我建议您从驱动程序不可知论者开始 SQLite documentation on the subject。它解释了布尔值的存储方式,以及不同的日期时间序列化方案,例如。
有关更多详细信息,System.Data.SQLite 是开源的,虽然在某些方面有些粗糙,但通常很容易阅读。
例如,GetValue()
方法(实现的 ADO.NET IDataReader
接口的一部分)在 SQLiteDataReader.cs 中调用名为 GetSQLiteType()
的方法,然后根据某些连接标志进行更多的自动检测。
GetSQLiteType()
和朋友们都回到 SQLiteConvert class,它进行实际的类型转换和检测。转换都在那里定义(大约在中途开始,在大量日期操作助手之后)。最终你到达这个与你的问题特别相关的函数:
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[]
数组和 Guid
s 也将透明地工作,尽管它们都存储为 blob。布尔值映射到 1 (true) 和 0 (false) 整数。并且支持所有 SQLite 日期时间表示,以及更多:请参阅 SQLite3.cs 中的 Bind_DateTime()
方法。
我正在努力寻找有关 System.Data.SQLite 在各种 .NET 数据类型方面的行为的文档。
例如,System.Data.SQLite 如何在 SQLite 数据库中存储 .NET 布尔值?有几种可能的方法:
- 整数 0 和 1
- 整数 0 和 –1
- 文本 'True' 和 'False'
- 文本 'T' 和 'F'
- 文本 'Y' 和 'N'
- 等...
反之亦然——布尔值是如何从 SQLite 中解析出来的? System.Data.SQLite 是否需要某种格式?那是什么格式?
缺乏这方面的文档令人沮丧。也许我没找对地方?
注意: 这不是专门针对布尔值的问题。我正在寻找解释所有 .NET 数据类型的行为的文档 。
我建议您从驱动程序不可知论者开始 SQLite documentation on the subject。它解释了布尔值的存储方式,以及不同的日期时间序列化方案,例如。
有关更多详细信息,System.Data.SQLite 是开源的,虽然在某些方面有些粗糙,但通常很容易阅读。
例如,GetValue()
方法(实现的 ADO.NET IDataReader
接口的一部分)在 SQLiteDataReader.cs 中调用名为 GetSQLiteType()
的方法,然后根据某些连接标志进行更多的自动检测。
GetSQLiteType()
和朋友们都回到 SQLiteConvert class,它进行实际的类型转换和检测。转换都在那里定义(大约在中途开始,在大量日期操作助手之后)。最终你到达这个与你的问题特别相关的函数:
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[]
数组和 Guid
s 也将透明地工作,尽管它们都存储为 blob。布尔值映射到 1 (true) 和 0 (false) 整数。并且支持所有 SQLite 日期时间表示,以及更多:请参阅 SQLite3.cs 中的 Bind_DateTime()
方法。