是否可以返回MS sql Server中表的最后一行.
我正在为ID使用自动增量字段,我想要添加最后一个用于加入其他内容的字段.任何想法?
我正在为ID使用自动增量字段,我想要添加最后一个用于加入其他内容的字段.任何想法?
这是代码:
const string QUERY = @"INSERT INTO Questions (ID,Question,Answer,CategoryID,Permission) " + @"VALUES (@ID,@Question,@Answer,@CategoryID,@Permission) "; 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); cmd.ExecuteNonQuery(); }
解决方法
using an auto increment field … and i want to get the last one just added to join it with something else.
这里的关键是“刚添加”.如果你有一堆不同的用户同时点击数据库,我认为你不希望用户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,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,Permission) " + "VALUES (@Question,@Permission);" + "SELECT scope_identity();"; int NewQuestionID; using (var cmd = new sqlCommand(QUERY,categoryID); NewQuestionID = (int)cmd.ExecuteScalar(); }
在这里查看我对另一个问题的回答:
get new SQL record ID
现在的问题是你可能希望后续的sql语句在同一个事务中.您可以使用客户端代码执行此操作,但我发现在服务器上将其全部保留为更清晰.你可以通过构建一个非常长的sql字符串来做到这一点,但我倾向于在这一点上更喜欢存储过程.
我也不是.AddWithValue()方法的粉丝 – 我更喜欢显式定义参数类型 – 但我们可以将其留在另一天.
最后,现在已经很晚了,但我想强调的是,尝试将这一切保留在db上真的更好.在一个sql命令中运行多个语句是可以的,并且您希望减少需要对数据库进行的往返次数以及在数据库和应用程序之间来回传递所需的数据量.它还使得更容易获得正确的交易并将事物保持在需要的位置.