在內存數據表中實現類似 SQL Server IDENTITY 或 Access AutoNumber 的自動遞增列,ADO.NET 提供了 AutoIncrement、AutoIncrementSeed、AutoIncrementStep 三大屬性。本文詳細講解配置步驟、代碼範例、常見陷阱與最佳實踐。
Int16、Int32、Int64(否則強制轉 Int32)column.AutoIncrement = trueAutoIncrementSeed(起始值,預設 0)、AutoIncrementStep(遞增值,預設 1)using System;
using System.Data;
public class AutoIncrementDemo
{
public static void Main()
{
var table = new DataTable("Employee");
// 1. 建立自動編號列:種子 10000,步長 5
var idCol = table.Columns.Add("員工號碼", typeof(int));
idCol.AutoIncrement = true;
idCol.AutoIncrementSeed = 10000;
idCol.AutoIncrementStep = 5;
idCol.ReadOnly = true; // 建議唯讀,防止手工修改破壞序列
idCol.AllowDBNull = false;
idCol.Unique = true;
// 2. 其他業務列
table.Columns.Add("姓名", typeof(string));
table.Columns.Add("部門", typeof(string));
// 3. 新增行驗證
for (int i = 0; i < 5; i++)
{
var row = table.NewRow();
row["姓名"] = $"員工{i+1}";
row["部門"] = "研發部";
// 不賦值「員工號碼」,ADO.NET 自動填充
table.Rows.Add(row);
}
// 4. 輸出結果
foreach (DataRow r in table.Rows)
Console.WriteLine($"{r["員工號碼"]}\t{r["姓名"]}\t{r["部門"]}");
/* 輸出:
10000 員工1 研發部
10005 員工2 研發部
10010 員工3 研發部
10015 員工4 研發部
10020 員工5 研發部
*/
}
}
idCol.AutoIncrementSeed = -1;
idCol.AutoIncrementStep = -1; // -1, -2, -3...
// 合併前,將目標表種子設置為現有最大值 + 步長
int maxId = table.AsEnumerable().Max(r => r.Field("員工號碼"));
idCol.AutoIncrementSeed = maxId + idCol.AutoIncrementStep;
DataTable 非線程安全。並發場景請:
lock(table) 同步 NewRow/AddConcurrentQueue 串行化入庫SqlBulkCopy 寫入時,目標表需定義 IDENTITY(10000,5),且 SqlBulkCopyOptions.KeepIdentity 保留源值;若目標表自增,源值會被忽略,資料庫重新生成。
| 屬性 | 類型 | 預設值 | 說明 |
|---|---|---|---|
| AutoIncrement | bool | false | 啟用自動編號 |
| AutoIncrementSeed | long | 0 | 第一行的值 |
| AutoIncrementStep | long | 1 | 每行遞增量 |
| ReadOnly | bool | false | 建議 true,防人工修改 |
| Unique | bool | false | 建議 true,保證唯一性 |
| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| 新行編號不遞增 | 未設 AutoIncrement=true | 檢查三大屬性均已設置 |
| 編號重複 | 手工賦值覆蓋自動值 | 設 ReadOnly=true、UI 隱藏該列 |
| 類型轉換異常 | 列類型非 Int16/32/64 | 聲明列時指定 typeof(int) |
| 合併表主鍵衝突 | 種子未同步 | 合併前重置 Seed = Max + Step |
ADO.NET DataColumn.AutoIncrement 讓內存表擁有資料庫級自增能力,配置極簡、性能極高。關鍵在於:類型正確、三屬性全設、ReadOnly 保護、合併同步 Seed。掌握這幾點,離線數據處理、報表生成、批量導入等場景遊刃有餘。