在C#中自动增加非主键(SQL Server 2014)

时间:2016-03-05 04:07:30

标签: c# sql sql-server increment

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();
}

上面写的是我在C#中为我的项目创建简单字符的代码。我有一个问题是自动增加CharacterSlot列,这是一个非主键,因为在下图中,CharacterID是我的主键。

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

Characters Table

Users Table

编辑:每个字符插槽是一个可点击的图片框,可以更改在字符选择屏幕上写入的统计数据的值,事情是,如果CharacterSlot始终为1,它将只显示Helios的统计数据和不是我要创建的其他角色(最多3个)。

Character Creation and Character Selection

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

这就是Sequence对象的用途。

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

https://msdn.microsoft.com/en-us/library/ff878370.aspx

您还可以在列的NEXT VALUE FOR约束中使用DEFAULT

答案 1 :(得分:0)

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

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