我通常在插入记录时使用存储过程,以确保获得正确的scope_identity()值。我现在需要使用SqlClient时获取插入记录的id字段。
我的理解是,如果我使用插入命令对scope_identity()命令进行批处理,那么它将仍然与insert命令处于同一范围内?像下面这样。虽然很难验证…我会100%以此得到正确的ID值吗?
(id字段是一个自动递增的bigint-SQL Server)
long newid = 0; using (SqlConnection conn = new SqlConnection(....)) { conn.Open(); using (SqlCommand comm = new SqlCommand ("insert into .... ; select SCOPE_IDENTITY();", conn)) { SqlDataReader reader = comm.ExecuteReader(); if (reader.HasRows) { reader.Read(); newid = Convert.ToInt64(reader[0]); } } }
从SCOPE_IDENTITY(重点为我的)文档中:
SCOPE_IDENTITY
返回插入到同一作用域的标识列中的最后一个标识值。范围是一个模块:存储过程,触发器,函数 或批处理 。因此,如果两个语句位于相同的存储过程,函数 或batch中 ,则它们在同一范围内。
在这种情况下,您的命令:
"insert into .... ; select SCOPE_IDENTITY();"
是批处理,因此,您将获得该批处理中最后插入的标识值,在这种情况下,它是插入项中的标识值,因为它是批处理中唯一的其他语句。