【问题标题】:Shared values in column between datatables in ado.netado.net 中数据表之间列中的共享值
【发布时间】:2010-10-20 20:33:50
【问题描述】:

我正在使用 c#,并且我有三个数据表,所有三个数据表都有一个名为 idnum 的 int 列,我需要保持 idnum 列中的所有数字在三个表中唯一,并且下一个数字将始终是可用的小数字.例如:

表一

idnum=1

idnum=3

idnum=4

表b

idnum=2

idnum=7

表c

idnum=8

在这种情况下,三个表中任何一个新行中的下一个数字将是数字 5,然后是 6,然后是 9。

我的问题是获得下一个数字的最佳方法是什么? 我不想用sql。

谢谢 努诺

【问题讨论】:

    标签: c# ado.net indexing datatable dataset


    【解决方案1】:

    您可能需要第四张表来保存所有“差距”数字。否则,您将不得不检查从 1 开始的每个数字。

    插入时:在“间隙”表中查找最小的数字。插入新项目时使用该编号。如果间隙表中没有项目,则使用所有表中 idnum 的 Max+1。

    删除时:将刚刚退休的号码放入“差距”表中。

    如果您的应用是多线程的,您必须添加一个锁以确保两个线程不会占用相同的间隙。

    【讨论】:

      【解决方案2】:

      您将无法自动执行此操作; ADO.NET 中内置的自动编号功能都适用于单个表。

      那么,鉴于您将不得不编写自己的方法来处理这个问题,那么最好的方法是什么?

      如果您使用的是数据库,我建议您使用第四张表,将三个主表中的 ID 列设置为存储第四张表 ID 的外键,并在第四张表中同步插入一行将一行插入其他三个中的任何一个的表。比如:

      INSERT INTO Sequence (DateInserted) VALUES (GETDATE())
      INSERT INTO TableA (SequenceID, ... ) VALUES (@@SCOPE_IDENTITY(), ...)
      

      但是您不想使用数据库,这表明您并不真正关心这些 ID 号的持久性。如果它们真的只需要在您的应用程序运行时存在,您可以使用静态字段来存储上次使用的 ID,并创建一个帮助类:

      public static class SequenceHelper
      {
         private static int ID;
         private static object LockObject = new object();
      
         public static int GetNextID()
         {
            lock (LockObject)
            {
               return ID++;
            }
         }
      }
      

      锁定并不是绝对必要的,但是使这段代码线程安全并没有什么坏处。

      然后您可以在三个数据表中的每一个上处理TableNewRow 事件,例如:

      DataTable t = MyDataSet["TableA"];
      t.TableNewRow += new delegate(object sender, DataTableNewRowEventArgs e)
         {
            r.Row["ID"] = SequenceHelper.GetNextID();
         };
      

      这将确保任何方法向每个表添加新行 - 无论是您的代码调用 NewRow() 还是通过数据绑定控件添加新行 - 添加的每一行都将其 ID 列设置为下一个 ID .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 2018-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-21
        • 1970-01-01
        相关资源
        最近更新 更多