如何检索从未提交的事务中的ID列的值?

时间:2015-10-12 13:30:13

标签: c# sql-server transactions integration-testing transactionscope

我正在编写一些集成测试,用于测试与MS SQL Server数据库通信的.NET网站的数据访问层。

我正在使用TransactionScope回滚测试期间所做的任何更改,如下所示:

public class DatabaseFixture
{
    private TransactionScope _transactionScope;

    [SetUp]
    public void SetUp()
    {
        _transactionScope = new TransactionScope(TransactionScopeOption.Required);
    }

    [TearDown]
    public void TearDown()
    {
        _transactionScope.Dispose();
    }
}

我想知道我在INSERT语句中添加的行的ID,因此我的查询看起来像insert into Exercises (Name) Values (@Name); SELECT SCOPE_IDENTITY();

一旦我添加了TransactionScope,SCOPE_IDENTITY()就不再返回正确的值。它总是返回1,即使该行可能是id 3或4.我猜这与事务未提交的事实有关。

SCOPE_IDENTITY()不是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

这与交易无关,我只是错误地使用了Dapper ORM。

我只是使用Execute而不是ExecuteScalar来执行我的插入操作,因此它没有返回我的select值。

以下是有效的代码:

var exerciseQuery = "insert into Exercises (Name) Values (@Name);" +
                    "SELECT SCOPE_IDENTITY();";
exercise.Id = connection.ExecuteScalar<int>(exerciseQuery, new { Name = name});