如何在插入后获取标识值

时间:2012-02-09 07:05:00

标签: c# sql ado.net

鉴于以下代码(除最后两行之外几乎无关紧要),您的方法是什么才能获得刚刚创建的新记录的标识字段的值?你是否会再次调用数据库来根据对象的主键检索它(如果没有它可能会有问题),或者基于最后插入的记录(这可能是多线程应用程序有问题)或者是也许是一种更聪明的方法,可以在插入的同时获得新值?

似乎应该有一种方法可以根据刚刚进行的插入操作获取Identity,而不必根据其他方法查询它。

public void Insert(O obj)
{
    var sqlCmd = new SqlCommand() { Connection = con.Conn };
    var sqlParams = new SqlParameters(sqlCmd.Parameters, obj);
    var props = obj.Properties.Where(o => !o.IsIdentity);

    InsertQuery qry = new InsertQuery(this.TableAlias);
    qry.FieldValuePairs = props.Select(o => new SqlValuePair(o.Alias, sqlParams.Add(o))).ToList();

    sqlCmd.CommandText = qry.ToString();
    sqlCmd.ExecuteNonQuery();
}

编辑:虽然这个问题不是最严格的重复,但它与这个问题几乎相同,它有一些非常好的答案:Best way to get identity of inserted row?

4 个答案:

答案 0 :(得分:2)

这在很大程度上取决于您的数据库服务器。例如,对于Microsoft SQL Server,您可以获取包含最后一个标识值的@@ IDENTITY变量的值。

为防止竞争条件,您必须将插入查询和变量读入事务中。

另一个解决方案可能是为每个类型的插件创建一个存储过程,并使其返回标识值并接受插入参数。

否则,在事务内部,您可以实现所需的任何ID分配逻辑,并从并发问题中保留。

答案 1 :(得分:1)

Afaik没有完成的方式。 我通过使用客户端生成的ID(guid)解决了这个问题,以便我的方法生成id并将其返回给调用者。

也许您可以分析一些SqlServer systables以查看上次更改的内容。但是你会遇到并发问题(如果其他人插入一个非常相似的记录会怎么样)。

所以我建议改变策略并在客户端生成id

答案 2 :(得分:1)

您可以查看:this link

我可以补充一点,为了避免存在多行,你可以使用“Transactions”,在同一个事务中制作Insert和select方法。

祝你好运。

答案 3 :(得分:0)

正确的方法是学习sql。

您可以在一次运行中执行SQL命令后跟SELECT,这样您就可以进入并返回指定的标识。