首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# ADO.NET DataTable 自動編號列完整指南

     編輯:關於C#

在內存數據表中實現類似 SQL Server IDENTITY 或 Access AutoNumber 的自動遞增列,ADO.NET 提供了 AutoIncrement、AutoIncrementSeed、AutoIncrementStep 三大屬性。本文詳細講解配置步驟、代碼範例、常見陷阱與最佳實踐。

一、三步啟用自動編號

  1. 數據類型:必須是 Int16、Int32、Int64(否則強制轉 Int32)
  2. 啟用屬性:column.AutoIncrement = true
  3. 設置種子/步長:AutoIncrementSeed(起始值,預設 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   研發部
        */
    }
}

三、進階場景與技巧

3.1 負數種子/步長(倒序編號)

idCol.AutoIncrementSeed = -1;
idCol.AutoIncrementStep = -1; // -1, -2, -3...

3.2 合併數據時避免主鍵衝突

// 合併前,將目標表種子設置為現有最大值 + 步長
int maxId = table.AsEnumerable().Max(r => r.Field("員工號碼"));
idCol.AutoIncrementSeed = maxId + idCol.AutoIncrementStep;

3.3 多線程並發新增行

DataTable 非線程安全。並發場景請:

  • 用 lock(table) 同步 NewRow/Add
  • 或改用 ConcurrentQueue 串行化入庫
  • 或直接寫入資料庫,利用資料庫自增主鍵

3.4 導出到資料庫保持自增

SqlBulkCopy 寫入時,目標表需定義 IDENTITY(10000,5),且 SqlBulkCopyOptions.KeepIdentity 保留源值;若目標表自增,源值會被忽略,資料庫重新生成。

四、屬性速查表

屬性類型預設值說明
AutoIncrementboolfalse啟用自動編號
AutoIncrementSeedlong0第一行的值
AutoIncrementSteplong1每行遞增量
ReadOnlyboolfalse建議 true,防人工修改
Uniqueboolfalse建議 true,保證唯一性

五、常見錯誤與解決

錯誤現象原因解決
新行編號不遞增未設 AutoIncrement=true檢查三大屬性均已設置
編號重複手工賦值覆蓋自動值設 ReadOnly=true、UI 隱藏該列
類型轉換異常列類型非 Int16/32/64聲明列時指定 typeof(int)
合併表主鍵衝突種子未同步合併前重置 Seed = Max + Step

六、總結

ADO.NET DataColumn.AutoIncrement 讓內存表擁有資料庫級自增能力,配置極簡、性能極高。關鍵在於:類型正確、三屬性全設、ReadOnly 保護、合併同步 Seed。掌握這幾點,離線數據處理、報表生成、批量導入等場景遊刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved