解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
6.53 KiB
X
# DbTable ʹÓÃÊÖ²á `NewLife.Data.DbTable` ÊÇÒ»¸öÇáÁ¿¼¶µÄÄÚ´æÊý¾Ý±í£¬ÓÃÓÚ³ÐÔØ¡°ÁУ¨×ֶΣ©+ ÐУ¨¼Ç¼£©¡±½á¹¹µÄÊý¾Ý¡£ ÊÊÓó¡¾°£º - DAL ²éѯºó°Ñ½á¹û¼¯»º´æµ½Äڴ棬֧³Ö¶à´Î±éÀú¡¢É¸Ñ¡¡¢×ª»» - ÔÚ²»ÒÀÀµ `DataTable` µÄÇé¿öϽøÐÐ¿çÆ½Ì¨Êý¾Ý½»»» - ½«Êý¾Ý¶ÁдΪ¶þ½øÖÆ£¨¸ßЧ/¿ÉѹËõ£©¡¢Json¡¢Xml¡¢Csv - ÔÚ±íÊý¾ÝÓëÄ£ÐÍÁбíÖ®¼ä×öÓ³Éä - ÃüÃû¿Õ¼ä£º`NewLife.Data` - Ïà¹ØÀàÐÍ£º`DbTable`¡¢`DbRow` Îĵµ£¨Õ¾µã£©£ºhttps://newlifex.com/core/dbtable --- ## 1. Êý¾Ý½á¹¹ `DbTable` µÄºËÐÄÓÉËIJ¿·Ö×é³É£º - `Columns`£ºÁÐÃûÊý×é - `Types`£ºÁÐÀàÐÍÊý×飨Óë `Columns` Ò»Ò»¶ÔÓ¦£© - `Rows`£ºÐм¯ºÏ£¨Ã¿ÐÐÊÇ `Object?[]`£¬Óë `Columns/Types` ¶ÔÆë£© - `Total`£º×ÜÐÐÊý£¨¶ÁÈ¡/дÈë¶þ½øÖÆÊ±»áʹÓã© ʾÀý£º ```csharp var dt = new DbTable { Columns = ["Id", "Name", "Enable"], Types = [typeof(Int32), typeof(String), typeof(Boolean)], Rows = [ new Object?[] { 1, "Stone", true }, new Object?[] { 2, "NewLife", false }, ], Total = 2 }; ``` ×¢Ò⣺ - ͨ³£ `Rows[i].Length == Columns.Length` - ¶þ½øÖƶÁдÒÀÀµ `Types`£¬½¨ÒéʼÖÕÓë `Columns` ͬ²½ÉèÖà --- ## 2. ´ÓÊý¾Ý¿â¶ÁÈ¡£¨`IDataReader` / `DbDataReader`£© ### 2.1 ͬ²½¶ÁÈ¡ ```csharp using var cmd = connection.CreateCommand(); cmd.CommandText = "select Id, Name from User"; using var dr = cmd.ExecuteReader(); var table = new DbTable(); table.Read(dr); Console.WriteLine(table); // DbTable[ÁÐÊý][ÐÐÊý] ``` `Read(dr)` »á×Ô¶¯µ÷Ó㺠- `ReadHeader(dr)`£º¶ÁÈ¡ÁÐÃûÓë×Ö¶ÎÀàÐÍ - `ReadData(dr)`£ºÖðÐжÁÈ¡²¢Ìî³ä `Rows/Total` ### 2.2 Òì²½¶ÁÈ¡ ```csharp await using var cmd = connection.CreateCommand(); cmd.CommandText = "select Id, Name from User"; await using var dr = await cmd.ExecuteReaderAsync(); var table = new DbTable(); await table.ReadAsync(dr); ``` ¿â´úÂëÄÚ²¿Ê¹Óà `ConfigureAwait(false)`¡£ ### 2.3 Ö¸¶¨×Ö¶ÎÓ³É䣨`fields`£© `ReadData`/`ReadDataAsync` Ö§³Ö´«Èë `fields`£¬ÓÃÓÚ½«¡°Ä¿±êÁÐ i¡±Ó³Éäµ½¶ÁÈ¡Æ÷µÄ¡°Ô´ÁÐ fields[i]¡±¡£ ```csharp // Ä¿±êÁУºId, Name table.Columns = ["Id", "Name"]; table.Types = [typeof(Int32), typeof(String)]; // ´Ó¶ÁÈ¡Æ÷µÄµÚ 2 ÁÐºÍµÚ 0 ÁÐȡֵ table.ReadData(dr, fields: [2, 0]); ``` #### `DBNull` ĬÈÏÖµ²ßÂÔ ¶ÁÈ¡µ½ `DBNull.Value` ʱ£¬`DbTable` »á°´¸ÃÁÐÀàÐÍдÈëĬÈÏÖµ£¨ÀýÈçÊýÖµ `0`¡¢`false`¡¢`DateTime.MinValue`£©£¬¶ø²»ÊDZ£Áô `null`¡£ --- ## 3. Óë `DataTable` »¥×ª ### 3.1 ´Ó `DataTable` ¶ÁÈ¡ ```csharp var table = new DbTable(); var count = table.Read(dataTable); ``` - »á´Ó `dataTable.Columns` »ñÈ¡ÁÐÃûÓëÀàÐÍ - »á°ÑÿÐÐµÄ `ItemArray` ×÷Ϊ `Object?[]` ¼ÓÈë `Rows` ### 3.2 дÈëµ½ `DataTable` ```csharp DataTable dataTable = table.ToDataTable(); // »ò¸´ÓÃÒÑÓжÔÏó var dt2 = table.Write(existing); ``` --- ## 4. ¶þ½øÖÆÐòÁл¯£¨ÍƼö£© `DbTable` ÄÚÖöþ½øÖƶÁд£¬ÊʺϴóÊý¾ÝÁ¿´«Êä/ÂäÅÌ£º - Í·²¿£º»ÃÊý + °æ±¾ + ±ê¼Ç + Áж¨Òå + ÐÐÊý - Êý¾ÝÌ壺°´ÁÐÀàÐÍ˳ÐòÖðֵдÈë - `*.gz` Îļþ¿É×Ô¶¯Ñ¹Ëõ/½âѹ ### 4.1 дÈë/¶ÁÈ¡ `Stream` ```csharp using var ms = new MemoryStream(); table.Write(ms); ms.Position = 0; var table2 = new DbTable(); table2.Read(ms); ``` ### 4.2 תΪÊý¾Ý°ü `IPacket` ÊʺÏÍøÂç´«Ê䣨ͷ²¿Ô¤Áô 8 ×Ö½Ú£¬·½±ãÉϲãЭÒé×·¼Ó°üÍ·£©£º ```csharp IPacket pk = table.ToPacket(); ``` ### 4.3 ±£´æ/¼ÓÔØÎļþ ```csharp table.SaveFile("data.db"); table.SaveFile("data.db.gz", compressed: true); var t2 = new DbTable(); t2.LoadFile("data.db"); ``` ### 4.4 µü´úÆ÷£º±ß¶Á±ß´¦Àí£¨±ÜÃâÒ»´ÎÐÔ¼ÓÔØÈ«²¿ `Rows`£© ```csharp var table = new DbTable(); foreach (var row in table.LoadRows("data.db.gz")) { // row ÊÇ Object?[] } ``` ˵Ã÷£º - `LoadRows` »áÏȶÁȡͷ²¿£¬ÔÙ¸ù¾Ý `Total` ¾ö¶¨¶ÁÈ¡ÐÐÊý - Èô `Total == 0` ÇÒÎļþ·Ç¿Õ£¬½«ÒÔ `rows = -1` Ò»Ö±¶Áµ½Á÷½áÊø ### 4.5 µü´úÆ÷£º±ß´¦Àí±ßдÈë ```csharp var table = new DbTable { Columns = ["Id", "Name"], Types = [typeof(Int32), typeof(String)] }; IEnumerable<Object?[]> rows = GetRows(); var count = table.SaveRows("data.db.gz", rows); ``` Ö¸¶¨ÁÐÓ³Éä˳Ðò£º ```csharp var fields = new[] { 1, 0 }; // Ä¿±êÁÐ i ¶ÔÓ¦Ô´ row µÄ fields[i] var count = table.SaveRows("data.db", rows, fields); ``` - `fields[i] == -1` ±íʾдÈë¿ÕÖµ£¨°´Ä¿±êÁÐÀàÐÍдÈ룩 --- ## 5. Json ÐòÁл¯ `ToJson()` »áÏÈת»»Îª¡°×ÖµäÊý×顱ÔÙÐòÁл¯£º ```csharp String json = table.ToJson(indented: true); ``` ×ÖµäÊý×éÐÎʽ£º ```csharp IList<IDictionary<String, Object?>> list = table.ToDictionary(); ``` - ×Öµä key ΪÁÐÃû `Columns[i]` - value ΪÐÐÖµ `row[i]` --- ## 6. Xml ÐòÁл¯ `GetXml()` »áÉú³É `DbTable` ¸ù½Úµã£¬ÄÚ²¿Ã¿ÐÐÊÇ `Table` ½Úµã£¬Ã¿¸öÁÐÃû×÷Ϊ×ӽڵ㡣 ```csharp String xml = table.GetXml(); ``` дÈëµ½ÈÎÒâ `Stream`£º ```csharp await table.WriteXml(stream); ``` ÀàÐÍдÈë²ßÂÔ£º - `Boolean`£ºÐ´Èë²¼¶ûÖµ - `DateTime`£ºÐ´Èë `DateTimeOffset` - `DateTimeOffset`£ºÖ±½ÓдÈë - `IFormattable`£º°´¸ñʽдÈë×Ö·û´® - ÆäËû£º`ToString()` --- ## 7. Csv ÐòÁл¯ ```csharp table.SaveCsv("data.csv"); var t2 = new DbTable(); t2.LoadCsv("data.csv"); ``` - `SaveCsv`£ºÏÈд±íÍ·£¨ÁÐÃûÐУ©ÔÙдÈëËùÓÐÐÐ - `LoadCsv`£ºµÚÒ»ÐÐ×÷Ϊ `Columns`£¬ÆäÓà×÷ΪÊý¾ÝÐÐ --- ## 8. Ä£ÐÍ»¥×ª ### 8.1 Ä£ÐÍÁбíдÈë `DbTable` ```csharp var list = new[] { new User { Id = 1, Name = "Stone" }, new User { Id = 2, Name = "NewLife" }, }; var table = new DbTable(); table.WriteModels(list); ``` ¹æÔò£º - Ñ¡Ôñ `T` µÄ¹«¹²ÊôÐÔ - ½ö±£Áô¡°»ù´¡ÀàÐÍÊôÐÔ¡±£¨`IsBaseType()`£© - Èô `Columns` Ϊ¿ÕÔò×Ô¶¯°´ÊôÐÔÉú³É `Columns/Types` - ÐÐֵͨ¹ý·´Éä¶ÁÈ¡£»ÈôÄ£ÐÍʵÏÖ `IModel`£¬ÔòÓÅÏÈÓÃË÷ÒýÆ÷ `model[name]` ### 8.2 `DbTable` ¶ÁȡΪģÐÍÁбí ```csharp IEnumerable<User> users = table.ReadModels<User>(); // »òÖ¸¶¨ Type IEnumerable<Object> objs = table.ReadModels(typeof(User)); ``` Ó³É乿Ôò£º - ʹÓà `SerialHelper.GetName(PropertyInfo)` »ñÈ¡×Ö¶ÎÃû£¨Ö§³ÖÌØÐÔ±ðÃû£© - ÁÐÃû´óСд²»Ãô¸ÐÆ¥ÅäÊôÐÔ - ÈôÄ¿±êÄ£ÐÍʵÏÖ `IModel`£¬Ôòͨ¹ýË÷ÒýÆ÷¸³Öµ£¬·ñÔòͨ¹ý·´Éä `SetValue` --- ## 9. ±ã½Ý¶ÁÈ¡£¨°´ÐÐÁлñȡֵ£© ```csharp var name = table.Get<String>(row: 0, name: "Name"); if (table.TryGet<Int32>(1, "Id", out var id)) { // ... } ``` - `GetColumn(name)` Ö§³ÖºöÂÔ´óСд --- ## 10. ö¾ÙÓë `DbRow` `DbTable` ʵÏÖ `IEnumerable<DbRow>`£¬¿ÉÖ±½Ó `foreach`£º ```csharp foreach (var row in table) { // row ÊÇ DbRow } ``` »ñȡָ¶¨ÐУº ```csharp var row = table.GetRow(0); ``` --- ## 11. ¿Ë¡ `Clone()` Ϊdz¿½±´£º - `Columns/Types` ¿½±´ÎªÐÂÊý×é - `Rows` ʹÓà `ToList()` ´´½¨ÐÂÁÐ±í£¬µ«ÐÐÊý×éÒýÓÃÈÔ¹²Ïí ```csharp var copy = table.Clone(); ``` --- ## 12. ³£¼ûÎÊÌâ ### 12.1 Ϊʲô `DBNull` »á±ä³ÉĬÈÏÖµ£¿ ÕâÊÇ `DbTable.ReadData(...)` µÄ¼È¶¨²ßÂÔ£º°´ÁÐÀàÐÍÌî³äĬÈÏÖµ£¬±ãÓÚºóÐøÖ±½Ó×öÊýÖµ/²¼¶û/ʱ¼ä¼ÆËã¡£ ÈôÒµÎñÐèÒª±£Áô `null` ÓïÒ壬ÇëÔÚÉϲã×ÔÐд¦Àí¡£ ### 12.2 ¶þ½øÖƸñʽÊÇ·ñÎȶ¨£¿ ¶þ½øÖƸñʽ°üº¬°æ±¾ºÅ£¨µ±Ç°°æ±¾Îª `3`£©¡£¶ÁȡʱÓöµ½¸ü¸ß°æ±¾»áÅ׳ö `InvalidDataException`¡£ ### 12.3 ´óÊý¾ÝÁ¿½¨ÒéÔõôÓã¿ - ¶ÁÈ¡£ºÓÅÏÈ `LoadRows`/`ReadRows` µü´úÏû·Ñ - дÈ룺ÓÅÏÈ `SaveRows`/`WriteRows` µü´úдÈë - ÍøÂç´«Ê䣺ʹÓà `ToPacket()`