C# 在C语言中自动递增非主键(SQL Server 2014)#

C# 在C语言中自动递增非主键(SQL Server 2014)#,c#,sql,sql-server,increment,C#,Sql,Sql Server,Increment,上面是我在C#中为我的项目编写的简单角色创建屏幕代码。我无法自动递增CharacterSlot列,这是一个非主键,因为在下图中,CharacterID是我的主键 我还选择了CharacterID作为主要角色,因为每个帐户可以有多个字符。下面是我的SQL Server数据库中的图像 编辑:每个角色槽是一个可点击的图片框,用于更改角色选择屏幕上写入的统计信息的值,问题是,如果角色槽始终为1,它将只显示Helios的统计信息,而不显示我将创建的其他角色(最多3个) 我如何解决这个问题 这就是序列

上面是我在C#中为我的项目编写的简单角色创建屏幕代码。我无法自动递增
CharacterSlot
列,这是一个非主键,因为在下图中,
CharacterID
是我的主键

我还选择了
CharacterID
作为主要角色,因为每个帐户可以有多个字符。下面是我的SQL Server数据库中的图像

编辑:每个角色槽是一个可点击的图片框,用于更改角色选择屏幕上写入的统计信息的值,问题是,如果
角色槽
始终为1,它将只显示Helios的统计信息,而不显示我将创建的其他角色(最多3个)


我如何解决这个问题

这就是序列对象的用途

private void btnOk_Click(object sender, EventArgs e)
{
        Helper.openConnection();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = Helper.cn;
        cmd.CommandText = "insert into Characters values(@Name, 'Novice', 1, 40, 10, 0, @STR, @AGI, @VIT, @DEX, @LUK, @INT, 1, 1)";
        cmd.Parameters.AddWithValue("@Name", txtName.Text);
        cmd.Parameters.AddWithValue("@STR", txtStr.Text);
        cmd.Parameters.AddWithValue("@AGI", txtAgi.Text);
        cmd.Parameters.AddWithValue("@VIT", txtVit.Text);
        cmd.Parameters.AddWithValue("@DEX", txtDex.Text);
        cmd.Parameters.AddWithValue("@LUK", txtLuk.Text);
        cmd.Parameters.AddWithValue("@INT", txtInt.Text);
        cmd.ExecuteNonQuery();
        Helper.cn.Close();
        MessageBox.Show("Character successfully created!");
        this.Close();
}


您还可以在列的
默认
约束中为
使用
下一个值。

因此,如果希望每次使用重新计数,您需要执行此操作。请注意,命令文本如何为要查找的计数声明自己的参数

CREATE SEQUENCE Test.CountBy1
    START WITH 1
    INCREMENT BY 1 ;
GO

CREATE TABLE Test.TestTable
     (CounterColumn int PRIMARY KEY,
    Name nvarchar(25) NOT NULL) ; 
GO

INSERT Test.TestTable (CounterColumn,Name)
    VALUES (NEXT VALUE FOR Test.CountBy1, 'Syed') ;
GO

SELECT * FROM Test.TestTable; 
GO

目的是什么?如果按它排序,它将提供与CharacterID相同的顺序。为什么在同一个表中需要多个自动递增字段?也许样本数据和预期结果会有帮助。@ESG我将使用它来从一个字符切换到另一个字符,我将发布一个屏幕截图以进行更新。@SGEDDS将更新我的问题。顺便说一句,总是列出你的列名是一个非常好的主意<代码>插入字符(第1列、第2列等)值(…)
。这将保护您不受表更改的影响。哦,我可以在C#中使用序列作为命令文本吗?我对C#相当陌生,所以任何提示都将不胜感激!
CREATE Database Test1
GO
Use Test1
GO
CREATE TABLE TestTable
     (CounterColumn int IDENTITY PRIMARY KEY,
    Name nvarchar(25) NOT NULL,
    SlotNumber INT NOT nULL,
    UserId INT NOT NULL

    )
GO


---- SQL Command Parameters----

Declare @Name nvarchar(25) = 'Tom';
Declare @UserId INT = 1;


----------------------- SQL Command Text------------
Declare @SlotNumber INT;
SELECT @SlotNumber = IsNull(Max(SlotNumber), 0) + 1 FROM TestTable WHERE UserId=@UserId;
INSERT INTO TestTable (Name, SlotNumber, UserId) VALUES (@Name, @SlotNumber, @UserId);

--------Check results -----------

SELECT * FROM TestTable