鉴于以下代码(除最后两行之外几乎无关紧要),您的方法是什么才能获得刚刚创建的新记录的标识字段的值?你是否会再次调用数据库来根据对象的主键检索它(如果没有它可能会有问题),或者基于最后插入的记录(这可能是多线程应用程序有问题)或者是也许是一种更聪明的方法,可以在插入的同时获得新值?
似乎应该有一种方法可以根据刚刚进行的插入操作获取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?
答案 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,这样您就可以进入并返回指定的标识。
见