我有一个INSERT查询,我希望DB返回刚刚插入的行的ID。
sqlString = "INSERT INTO MagicBoxes (OwnerID, Key, Name, Permissions, Active, LastUpdated) VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) SET @ID = SCOPE_IDENTITY();";
cmd = new SqlCommand(sqlString, con);
cmd.Parameters.AddWithValue("@OwnerID", OwnerID);
cmd.Parameters.AddWithValue("@BoxKey", BoxKey);
cmd.Parameters.AddWithValue("@BoxName", BoxName);
cmd.Parameters.AddWithValue("@Username", Username);
cmd.Parameters.AddWithValue("@Date", DateTime.Now);
cmd.ExecuteNonQuery();
我目前有这个,我不确定接下来我需要做什么......
答案 0 :(得分:34)
你只需要在params集合中添加@ID,然后像这样检索它,
cmd.Parameters.Add("@ID", SqlDbType.Int, 4).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
//Now just read the value of: cmd.Parameters["@ID"].value
或者,如果您更喜欢这种语法:
SqlParameter param = new SqlParameter("@ID", SqlDbType.Int, 4);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);
答案 1 :(得分:21)
你有两种选择;您可以声明一个名为Output
的{{1}}参数;或 - 您可以将结尾更改为@ID
并使用:
SELECT SCOPE_IDENTITY()
我更喜欢形式参数方法,但int id = (int)cmd.ExecuteScalar();
效果很好。
答案 2 :(得分:17)
自SQL Server 2008起,在TSQL语法中添加了OUTPUT clause。这允许您将受DML查询影响的数据添加到表格数据流中。
虽然在查询返回正确的信息后查询SCOPE_IDENTITY(),但它强制SQL Server执行2个查询,其中output子句将此限制为一个查询。
知道这一点,正在执行的查询可以改变如下(假设[Id]
是身份的名称):
INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated)
OUTPUT INSERTED.Id
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date)
另一个问题是没有处置SqlCommand
。 ADO.net中的大多数Sql...
对象都实现IDisposable
,并且应该正确处理。
将所有内容整合在一起我将按如下方式实现这段代码:
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
using (var cmd = new SqlCommand(@"
INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated)
OUTPUT INSERTED.Id
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) ", conn))
{
cmd.Parameters.AddRange(new[]
{
new SqlParameter("@OwnerID", SqlDbType.Int).Value = OwnerID,
new SqlParameter("@BoxKey", SqlDbType.VarChar).Value = BoxKey,
new SqlParameter("@BoxName", SqlDbType.VarChar).Value = BoxName,
new SqlParameter("@Date", SqlDbType.DateTime).Value = DateTime.Now
});
conn.Open();
var id = (int)cmd.ExecuteScalar();
}
答案 3 :(得分:5)
将此添加到您的参数
SqlParameter IDParameter = new SqlParameter("@ID",SqlDbType.Int);
IDParameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(IDParameter);
执行后,您可以检索ID
int id = (int)IDParameter.Value;
答案 4 :(得分:0)
为什么不调用商店程序。将值传递给存储过程以获取插入的值,并从SP返回使用SCOPE_IDENTITY().
插入的最后一个种子值。希望此帮助。