c# - 插入后如何取回标识值

标签 c# sql ado.net

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

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

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?

最佳答案

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

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

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

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

关于c# - 插入后如何取回标识值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9206713/

相关文章:

php - 查询多个 WHERE 不工作

asp.net连接字符串问题(数据库位于服务器端)

c# - 如何将文件路径与文件搜索模式(即 *.jpg)相匹配?

c# - TKey 上具有不同数据类型的 OrderBy keySelector

c# - 如何使用 IComparable 和 IComparer 对对象列表进行排序

c# - 从 SQL Server 检索 blob 数据的最有效内存方式

linq - 是否有 IQueryable 通过 DbDataReader 的实现?

c# - 如何访问 System.Windows.Forms.Design.ParentControlDesigner?

sql - R:粘贴中的双引号,如何消除反冲

sql - PostgreSQL:如何将数组传递给函数并在带有 IN 运算符的查询中使用它