Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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/7/sql-server/23.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# 如何获取表的最高ID号并将其递增?_C#_Sql Server_Tsql - Fatal编程技术网

C# 如何获取表的最高ID号并将其递增?

C# 如何获取表的最高ID号并将其递增?,c#,sql-server,tsql,C#,Sql Server,Tsql,我想获得表中的最高ID号并将其递增,但它似乎返回0 private int MaxAuthorValue() { string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Library;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";

我想获得表中的最高ID号并将其递增,但它似乎返回0

private int MaxAuthorValue()
{
    string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Library;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        string maxQuery = "SELECT MAX(AuthorId) FROM Author";
        SqlCommand command = new SqlCommand(maxQuery, connection);
        int x = (int)command.ExecuteScalar();
        return x + 1;
    }
}
我想做的是返回修改后的ID,这样用户就可以添加作者,而不必自己在ID中写入,因为这样做是非常不安全的(例如,如果一个作者的ID=1,他们试图添加另一个具有相同ID号的作者,则会产生错误)

编辑:添加SQLServer表创建代码

CREATE TABLE [dbo].[Author] 
(
    [AuthorId] INT NOT NULL IDENTITY(1,1),
    [Name] NVARCHAR (50) NOT NULL,
    [Nationality] NVARCHAR (50) NOT NULL, 
    PRIMARY KEY CLUSTERED ([AuthorId] ASC)
);
您可以使用获取该表最后提供的标识

它将为您提供所有作用域和会话的最后一个,这一点很重要-其他用户可能在他们的会话中打开了带有新插入的事务。默认情况下,
select max(id\u列)from…
仅在会话中起作用

如果您想要下一个id,请使用

更聪明的是自动分配ID—您只需在
插入中不提供ID列,SqlServer就会为您做正确的事情:

自动递增标识,请参见这里的f.e.:

如果表还不是很大,我建议您删除并使用

CREATE TABLE dbo.<YOUR-TABLE-NAME>
(
  Id int NOT NULL
         IDENTITY(1, 1),
  --Other Column names and types
)
ON  [PRIMARY]
GO
创建表dbo。
(
Id int不为空
身份(1,1),
--其他列名和类型
)
在[小学]
去
如果没有,则添加一个新列并将其用作ID

ALTER <YOUR-TABLE-NAME>
ADD <NEW-ID-COLUMN-NAME> INT IDENTITY(1, 1)
GO
ALTER
添加INT标识(1,1)
去
然后删除现有的ID列


编辑:您还试图为标识列插入值。您不应该为
AuthorId
插入任何值。也就是说,除了
AuthorId

“似乎不起作用”之外,您应该只为其余列插入值。这不是描述问题的正确方法。你期望得到什么,你得到什么?不要自己增值。使用
标识
列。对不起。我编辑了它,现在有了更好的解释,你这样做的目的是什么?在您读取该值后,该值完全有可能发生更改,因此您需要确保事务的安全。您也完全可能不需要这样做,因为数据库本机处理自动增量/标识列。@anek05-如果您说这是用于插入具有新的唯一id的新行,请不要这样做。查看SQL Server中的
IDENTITY
列。SQL Server然后为您分配新的id,您可以避免竞争条件和其他一百个问题。如何启用IDENTITY_INSERT?我得到“当identity_insert设置为OFF时无法在表Author中插入identity列的显式值”
CREATE table[dbo].[Author]([authord]INT NOT NULL identity(1,1),[Name]NVARCHAR(50)NOT NULL,[national]NVARCHAR(50)NOT NULL,主键集群([authord]ASC));
您可以发布用于创建表的SQL代码吗?
创建表[dbo]。[Author]([authord]INT NOT NULL IDENTITY(1,1),[Name]NVARCHAR(50)NOT NULL,[national]NVARCHAR(50)NOT NULL,主键集群([authord]ASC))我看到了您正在犯的错误。我正在向我的回答中添加其他信息。谢谢,这已经解决了!我欢迎投反对票的反馈——我可能会相应地调整我的答案。我觉得你的答案最接近OP的要求。他最初想要的是AuthorID列中没有重复的ID,我相信他没有意识到像将列标记为
Identity
这样的东西存在。