Dot-Net
System.Data.SQLite 如何處理 .NET 數據類型?
我正在努力尋找有關 System.Data.SQLite 關於各種 .NET 數據類型的行為的文件。
例如,System.Data.SQLite 如何在 SQLite 數據庫中儲存 .NET 布爾值?有幾種可能的方法:
- 整數0和1
- 整數0和**–1**
- 文本**“真”和“假”**
- 文本**“T”和“F”**
- 文本**“Y”和“N”**
- ETC…
反之亦然——布爾值是如何從 SQLite 中解析出來的?System.Data.SQLite 是否需要某種格式?那是什麼格式?
缺乏這方面的文件令人沮喪。也許我沒有找對地方?
**注意:**這不是專門針對布爾值的問題。我正在尋找解釋所有 .NET 數據類型行為的文件。
我建議您從與驅動程序無關的SQLite 文件開始。例如,它解釋了布爾值的儲存方式,以及不同的日期時間序列化方案。
有關更多詳細資訊,System.Data.SQLite 是開源的,雖然在某些方面有點笨拙,但通常很容易閱讀。
例如,SQLiteDataReader.cs
GetValue()中的方法(已實現的 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()中的方法。