System.Data.SQLite如何处理.NET数据类型?

时间:2015-06-15 20:46:37

标签: .net sqlite system.data.sqlite

我很难找到有关各种.NET数据类型的System.Data.SQLite行为的文档。

例如,System.Data.SQLite如何在SQLite数据库中存储.NET布尔值?有几种可能的方法:

  • 整数 0 1
  • 整数 0 -1
  • 文字'真''错误'
  • 文字'T''F'
  • 文字'Y''N'
  • 等...

反之亦然 - Booleans如何从SQLite中解析出来? System.Data.SQLite是否期望某种格式?这种格式是什么?

缺乏关于此的文档令人沮丧。也许我不是在寻找合适的地方?

注意:这不是专门针对布尔人的问题。我正在寻找解释所有.NET数据类型行为的文档

1 个答案:

答案 0 :(得分:2)

我建议你从与驱动程序无关的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[]数组和Guid也可以透明地工作,但两者都存储为blob。布尔值映射到1(真)和0(假)整数。并且支持所有SQLite日期时间表示,以及更多:请参阅SQLite3.cs中的Bind_DateTime()方法。