【问题标题】:How to retrieve the value of an ID column inside a transaction that is never committed?如何在从未提交的事务中检索 ID 列的值?
【发布时间】:2015-10-12 13:30:13
【问题描述】:

我正在编写一些集成测试,用于测试与 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() 不是正确的方法吗?

【问题讨论】:

  • 你能试试@@IDENTITY吗?
  • 你能显示实际执行 SQL 的代码吗?
  • 这个问题完全可以关闭!希望没有其他人会重复我的愚蠢错误。 :)

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


【解决方案1】:

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

我只是使用 Execute 而不是 ExecuteScalar 进行插入,所以它没有返回我的选择值。

这是有效的代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多