0

我正在尝试用 C# 编写一个简单的数据库管理工具。我正在编写一个将新行插入数据库的函数,但我遇到了一个问题。我需要能够检测哪些 ID 号尚未被使用。我做了一些研究,但没有找到任何明确的答案。

Example table:
ID    Name
---------------
1     John
2     Linda
4     Mark
5     Jessica

如何添加一个自动检测 ID 3 为空并在那里放置新条目的函数?

编辑:我真正的问题是;当我想通过 C# 插入新行时,如何处理自动递增的列?一个例子会很棒:)

4

4 回答 4

3

我不喜欢给出这样的答案......但无论如何我都会在这个场合。

如果您将更多数据存储在另一个表中,该表中的 ID 具有外键,该怎么办?如果您重复使用数字,您将在后续的参考完整性方面遇到麻烦。

我假设你的领域是一个int?如果是这样,自动增量应该足以满足大多数用途。它使您的插入更简单,并保持完整性。

编辑:您可能有一个很好的理由这样做,但我想指出一点,以防有人出现并稍后看到这个认为这是个好主意的人。

于 2013-01-31T16:27:06.110 回答
1

SQL:

SELECT ID From TABLE

或者

SELECT  t.ID
FROM    ( SELECT    number + 1 AS ID
          FROM      master.dbo.spt_values
          WHERE     Type = 'p'
                    AND number <= ( SELECT  MAX(ID) - 1
                                    FROM    @Table
                                  )
        ) t
        LEFT JOIN @Table ON t.ID = [@Table].ID
WHERE   [@Table].ID IS NULL

C#

DataTable dt = new DataTable();
//Populate Dt with SQL
var tableInts = dt.Rows.Cast<DataRow>().Select(row => row.Field<int>("ID")).ToList<int>();
var allInts = Enumerable.Range(1, tableInts.Max()).ToList();
var minInt = allInts.Except(tableInts).Min();
于 2013-01-31T16:34:33.130 回答
0
SELECT      #temp.Id
FROM        #temp
LEFT JOIN   table1 ON #temp.Id = table1.Id
WHERE       table1.Id IS NULL

尝试这个?

但我的建议是,只需自动增加该字段。

你如何做到这一点,你将列的 IDENTITY 属性设置为 true,并将其设置为主键(非空)。

要处理插入,您可能需要触发器,它们类似于存储过程,但它们可以代替插入或更新或删除,或插入/更新/删除之前/之后

谷歌触发器。

于 2013-01-31T16:28:21.863 回答
0

来自如何使用 SQL 在运行计数器中找到“差距”?

select
    MIN(ID)
from (
    select
        0 ID
    union all
    select
        [YourIdColumn]+1
    from
        [YourTable]
    where
        --Filter the rest of your key--
    ) foo
left join
    [YourTable]
    on [YourIdColumn]=ID
    and --Filter the rest of your key--
where
    [YourIdColumn] is null
于 2013-07-02T17:29:45.957 回答