使用自动递增字段...我想获取刚刚添加的最后一个,以便将其与其他内容连接起来。
关键在于“刚刚添加”。如果有许多不同的用户同时访问数据库,我认为您不希望用户A检索由用户B创建的记录。这意味着您可能需要使用scope_identity()函数来获取该ID,而不是立即再次在表上运行查询。
根据上下文,您可能还需要@@identity(包括触发器)或ident_current('questions')(限于特定表,但不是特定范围)。但是,scope_identity()几乎总是要使用的正确方法。
以下是示例:
DECLARE @NewOrderID int
INSERT INTO TABLE [Orders] (CustomerID) VALUES (1234)
SELECT @NewOrderID=scope_identity()
INSERT INTO TABLE [OrderLines] (OrderID, ProductID, Quantity)
SELECT @NewOrderID, ProductID, Quantity
FROM [ShoppingCart]
WHERE CustomerID=1234 AND SessionKey=4321
根据您发布的代码,您可以执行以下操作:
const string QUERY = "INSERT INTO Questions (Question, Answer, CategoryID, Permission) "
+ "VALUES (@Question, @Answer, @CategoryID, @Permission);"
+ "SELECT scope_identity();";
int NewQuestionID;
using (var cmd = new SqlCommand(QUERY, conn))
{
cmd.Parameters.AddWithValue("@Question", question);
cmd.Parameters.AddWithValue("@Answer", answer);
cmd.Parameters.AddWithValue("@CategoryID", lastEdited);
cmd.Parameters.AddWithValue("@Permission", categoryID);
NewQuestionID = (int)cmd.ExecuteScalar();
}
请看我在这里回答另一个问题的答案:
获取新的SQL记录ID
现在的问题是,您很可能希望随后的SQL语句在同一个事务中。您可以使用客户端代码来完成此操作,但我发现将其全部保留在服务器上更加清晰。在这一点上,您可以通过构建非常长的SQL字符串来实现,但我倾向于使用存储过程。
我也不喜欢.AddWithValue()
方法——我更喜欢显式定义参数类型——但我们可以把它留到以后再说。
最后,现在已经有点晚了,但我想强调的是,最好尝试将所有内容都保留在数据库中。可以在一个SQL命令中运行多个语句,并且您希望减少需要在数据库和应用程序之间传递的往返次数和数据量。这也使得更容易正确处理事务并保持原子性。