使用自动增量字段...我想获取刚刚添加的最后一个以将其与其他内容加入。
这里的关键是“刚刚添加”。如果您有一堆不同的用户同时访问数据库,我认为您不希望用户 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
根据您发布的代码,您可以执行以下操作:
// don't list the ID column: it should be an identity column that sql server will handle for you
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();
}
在此处查看我对另一个问题的回答:
get new SQL record ID
现在的问题是您可能希望后续的 sql 语句在同一个事务中。您可以使用客户端代码执行此操作,但我发现将其全部保存在服务器上会更干净。你可以通过构建一个很长的 sql 字符串来做到这一点,但我现在更喜欢存储过程。
我也不喜欢 .AddWithValue() 方法——我更喜欢明确定义参数类型——但我们可以改天再说。
最后,现在有点晚了,但我想强调的是,最好将这一切都保存在数据库中。在一个 sql 命令中运行多个语句是可以的,并且您希望减少需要对 db 进行的往返次数以及需要在 db 和您的应用程序之间来回传递的数据量。它还可以更轻松地正确处理事务并在需要的地方保持原子性。