您好我在我的数据库中插入递增的用户ID是我的表,存储过程和我的代码。
CREATE TABLE [dbo].[Assignment2]
(
userID int PRIMARY KEY IDENTITY(1,1),
Name varchar(255) NOT NULL,
Age int NOT NULL,
Hobbies varchar(255)
)
和存储过程
ALTER PROCEDURE [db].[p_Assignment2_ins]
@userID int,
@Name nvarchar(100),
@Age int,
@Hobbies nvarchar(100)
AS
INSERT INTO [DB].[db].[Assignment2]
([Name]
,[Age]
,[Hobbies])
VALUES
(@Name
,@Age
,@Hobbies)
If @@Error <> 0
Return -1
Select @userID = @@Identity // this one just get the latest id that we inserted right?
Return 0
我有一些问题:
我想知道如何从后面的代码中插入UserID
因为如果表一开始是空的,我们不应该先将数据插入表中
我们如何从代码隐藏生成AutoIncrementID
并插入
SqlConnection conn = new SqlConnection(ts.ConnMethod());
SqlCommand cmd = new SqlCommand("p_Assignment2_ins", conn);
cmd.CommandType = CommandType.StoredProcedure;
//I'm missing how we should add the IncrementedID
cmd.Parameters.AddWithValue("@Name", TextBox1.Text);
cmd.Parameters.AddWithValue("@Age", TextBox2.Text);
cmd.Parameters.AddWithValue("@Hobbies", TextBox3.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
非常感谢任何帮助
答案 0 :(得分:3)
Select @userID = @@Identity // this one just get the latest id that we inserted right?
不,你应该使用SCOPE_IDENTITY()
。 @@ Identity返回最后一个ID,是,但不是您的插入的最后一个ID。例如,如果你有一个触发器,它也会因为你的插入而在另一个表上产生一个插入,那么你将通过该触发器将id插入到另一个表中。
Here's a nice article解释了这些差异。
在您的桌子上插入自动增量值;除非先禁用约束,否则不能这样做,但实质上,除非您正在进行某种数据导入,否则这不是必需的。在您的方案中,您应该能够在除了具有自动增量的标识字段之外的其他列上插入值。数据库将负责为您插入适当的值。
答案 1 :(得分:2)
如果你有AUTOINCREMENT字段,你不应该插入并生成值。 DB正在完成所有工作。因此,删除插入ID-s的代码