v9.0.2016.0413 去掉模型解析器自动修正表名字段名的功能
|
# 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()`
|