Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除在C中自动生成ID的中间行_C#_Sql_Winforms_Sql Server 2005 - Fatal编程技术网

C# 删除在C中自动生成ID的中间行

C# 删除在C中自动生成ID的中间行,c#,sql,winforms,sql-server-2005,C#,Sql,Winforms,Sql Server 2005,我在SQLServer2005中创建了一个数据库,并使用CountAllRows表创建了一个具有自动生成id字段的表 我还开发了一个c桌面应用程序项目 我有一个问题,如果我在数据库中删除了1行表,其中id是通过编码c自动生成的,那么我如何设置自动生成id,就像前面删除了id一样? 因为在删除字段的同时,所有行的计数都会减少,而我的计数会增加 因此,我的自动生成id是错误的,因为id冲突 这是我的自动生成id public string generateIdActivity() { str

我在SQLServer2005中创建了一个数据库,并使用CountAllRows表创建了一个具有自动生成id字段的表

我还开发了一个c桌面应用程序项目

我有一个问题,如果我在数据库中删除了1行表,其中id是通过编码c自动生成的,那么我如何设置自动生成id,就像前面删除了id一样? 因为在删除字段的同时,所有行的计数都会减少,而我的计数会增加

因此,我的自动生成id是错误的,因为id冲突

这是我的自动生成id

public string generateIdActivity()
{
    string activity = "";
    int jml = myActivity.getCountActivity() + 1;
    if (myActivity.getCountActivity() < 10)
    {
        activity = "ACT0000" + jml;
    }
    if (myActivity.getCountActivity() < 100 && myActivity.getCountActivity() > 9)
    {
        activity = "ACT000" + jml;
    }
    if (myActivity.getCountActivity() < 1000 && myActivity.getCountActivity() > 99)
    {
        activity = "ACT00" + jml;
    }
    if (myActivity.getCountActivity() < 10000 && myActivity.getCountActivity() > 999)
    {
        activity = "ACT0" + jml;
    }
    if (myActivity.getCountActivity() < 100000 && myActivity.getCountActivity() > 9999)
    {
        activity = "ACT" + jml;
    }
    return activity;
}
你没有。 我建议使用SQL Server为您分配id

具有自动生成id字段的表

给你。标识字段不计算行数,因此在元数据表中有一个单独的计数器

因此,在插入4之后,您将得到5-无论4或任何其他行是否仍然存在或已被删除

但是:您没有自动生成Id字段

你的设计很糟糕

问题是残酷地说: *不要计数,使用最大值 *但是,您如何处理多个用户/线程同时执行的多个插入

通常,您要查找的是一个序列,该序列应该在数据库中实现,并询问下一个数字。Sql server 2012中的平凡-使用新序列。对于2005,您应该将自己的最后一个值放入单独表中的某个字段中


介绍自定义序列的各种方法。

您不应该使用这种方法生成密钥,因为正如您自己所看到的,它会导致各种问题

还要考虑一下,如果应用程序的两个或多个实例同时尝试插入记录,可能会发生什么情况—它们最终都会在表中获得相同数量的记录,并且都尝试发送相同的ID

如果需要自动生成的密钥,最简单的方法是使用标识列:

CREATE TABLE MyTable
(
    ID int identity primary key,
    SomeData nvarchar(255)
)
现在,当您想要插入到上面的表中时,您只需要使用 在MyTableSomeData中插入“hello world”值,ID列将自动分配,不会发生冲突

您可以使用SELECT SCOPE_identity从特定连接检索最后生成的标识,以便知道刚才插入的记录的ID

更新:您使用的钥匙上有一个小说明

我建议不要使用看起来像“ACT00001”或类似的主键,因为尽管现在它很有意义,但非常聪明,你实际上是在把自己逼到一个角落里——如果业务部门在6个月后决定活动真的应该被称为任务,那么你就会被一堆看起来很奇怪的标识符所困扰,你无法轻易改变

现在最好还是使用数字标识符,您可以将其格式化为在演示代码中显示“ACT00001”等等


标识列的名声不好,我不明白为什么不应该在您的案例中使用它们,或者您也可以使用编辑:我注意到您使用的是SQL Server 2005,所以这实际上不可能是个坏主意。绝不允许标识属性生成业务级别的编号方案。可能还有其他要求——比如没有洞,身份不能保证,但发票号码是合法要求的。这里需要一个自定义序列。sql 2005意味着必须对其进行编程。@TomTom-谁说这是在生成业务级别的编号方案?我不知道在业务上下文中使用主键(如发票号)是个坏主意,而依赖连续的键序列更糟。@StephenByrne他的活动Id不是纯数字,而是以前缀开头。使用业务键作为主键是很好的——有一整套的思想都在谈论sql中的自然键。并不是说我喜欢它。。。但是谁说主键呢。唯一索引也有同样的问题。请仔细考虑你的陈述。@TomTom-很公平,但这是你对他的身份目的的假设。我不想让这场辩论变成一场自然与代理的关键辩论,我只想说,在我看来,根据个人经验,这是个坏主意。但如果它对你有用,那就太好了!我知道我的评论与这里提出的问题无关。。但这段代码可以临时编写。您多次调用函数myActivity.getCountActivity。这是不必要的开销。您可以将值保存到变量并使用它,也可以使用变量jml-1。。这将即兴编写代码。。这只是个建议……够有趣的,他从来不说主键。我的数据库有一个模式,其中大多数名为Code的表中都有一个唯一的id字段,有些表必须遵循自动生成的机制,例如发票号。Id不会自动暗示主键-唯一的索引会触发相同的行为。@TomTom yep我想我是 我还犯有以下罪行: