如何在插入后获取缩进值

本文关键字:获取 缩进 插入 | 更新日期: 2023-09-27 18:24:04

给定以下代码(除了最后两行之外,大部分代码都不相关),您的方法是什么来获取刚刚创建的新记录的标识字段的值?您会根据对象的主键(如果没有主键,可能会有问题),或者根据上次插入的记录(多线程应用程序可能会有麻烦),再次调用数据库来检索它吗?或者,在进行插入的同时,是否有更聪明的方法可以取回新值?

似乎应该有一种方法可以根据刚刚进行的插入操作取回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();
}

编辑:虽然这个问题不是最严格的重复问题,但它几乎与这个问题完全相同,这个问题有一些非常好的答案:获得插入行标识的最佳方法?

如何在插入后获取缩进值

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

为了防止出现竞争条件,您必须将插入查询和变量保持在事务内部读取。

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

否则,在事务中,您可以实现您想要的任何ID分配逻辑,并避免并发问题。

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

也许您可以分析一些SqlServer系统,看看上次发生了什么变化。但是您会遇到并发问题(如果其他人插入了一个非常相似的记录怎么办)。

因此,我建议更改策略,并在客户端

上生成id

您可以查看:此链接。

我可以补充一点,为了避免可能存在多行的事实,您可以使用"事务",在同一事务中使用Insert和select方法。

祝你好运。

正确的方法是学习sql。

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

参见