Dot-Net

System.Data.SQLite 如何處理 .NET 數據類型?

  • June 15, 2015

我正在努力尋找有關 System.Data.SQLite 關於各種 .NET 數據類型的行為的文件。

例如,System.Data.SQLite 如何在 SQLite 數據庫中儲存 .NET 布爾值?有幾種可能的方法:

  • 整數01
  • 整數0和**–1**
  • 文本**“真”“假”**
  • 文本**“T”“F”**
  • 文本**“Y”“N”**
  • ETC…

反之亦然——布爾值是如何從 SQLite 中解析出來的?System.Data.SQLite 是否需要某種格式?那是什麼格式?

缺乏這方面的文件令人沮喪。也許我沒有找對地方?

**注意:**這不是專門針對布爾值的問題。我正在尋找解釋所有 .NET 數據類型行為的文件。

我建議您從與驅動程序無關的SQLite 文件開始。例如,它解釋了布爾值的儲存方式,以及不同的日期時間序列化方案。

有關更多詳細資訊,System.Data.SQLite 是開源的,雖然在某些方面有點笨拙,但通常很容易閱讀。

例如,SQLiteDataReader.csGetValue()中的方法(已實現的 ADO.NETIDataReader介面的一部分)呼叫名為 的方法,然後根據某些連接標誌進行更多的自動檢測。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[]arrays 和Guids 也將透明地工作,儘管兩者都儲存為 blob。布爾值映射到 1(真)和 0(假)整數。並且支持所有 SQLite 日期時間表示,以及更多:請參閱SQLite3.csBind_DateTime()中的方法。

引用自:https://stackoverflow.com/questions/30854689