【问题标题】:How to get inserted row ID with WebMatrix如何使用 WebMatrix 获取插入的行 ID
【发布时间】:2011-10-13 10:55:29
【问题描述】:

WebMatrix 中有一个GetLastInsertId 方法。但是,使用 Reflector,我可以看到它是这样实现的:

[return: Dynamic]
public object GetLastInsertId()
{
    return this.QueryValue("SELECT @@Identity", new object[0]);
}

据我所知,这是一种非常糟糕的做法,因为@@Identity 返回考虑到每个表和每个会话的最后一个插入。我需要将此限制在我正在使用的范围和会话中,因此我希望它使用SELECT SCOPE_IDENTITY(),因为根据我的阅读,这似乎也是最常用的。

我的问题是:

  1. WebMatrix 包装器是否可以在我的情况下使用它?
  2. 如果没有,是否有一种简单的方法可以使用 WebMatrix 类获取插入查询的插入 ID,还是我应该为此使用 SqlClient 之类的东西?

如果有影响的话,我对 SQL Server(非紧凑型)的答案很感兴趣。

【问题讨论】:

    标签: asp.net sql sql-server razor webmatrix


    【解决方案1】:

    我遇到了同样的问题,我阅读了这些答案,但仍然无法让代码正常工作。我可能误读了上面的解决方案,但似乎对我有用的方法如下:

      var db=Database.Open(...);
      var lastInsertID = db.QueryValue("INSERT name into Names; SELECT SCOPE_IDENTITY()");
    

    【讨论】:

      【解决方案2】:

      引用David Fowler,WebMatrix 中数据 API 的开发人员之一:“[SCOPE_IDENITTY] 在 ce 上不起作用”。因为我们想要一个可以在 CE 和常规 SQL Server 上运行的数据 API,所以我们使用了@@Identity。所以如果你想专门使用 SCOPE_IDENTITY,你应该使用 db.QueryValue 方法:

      var db = Database.Open(...);
      db.Insert(...);
      var lastInsertId = db.QueryValue("SELECT SCOPE_IDENTITY()")
      

      【讨论】:

      • 哦,那是有道理的。 SCOPE_IDENTITY() 会按照您编写的方式按预期工作吗?我有点困惑,因为我看到一些开发人员说它应该在存储过程中使用,尽管它上面的 MSDN 页面没有使用存储过程。
      • 老实说,我不能 100% 确定,您可能需要测试。 SCOPE_IDENTITY 可能必须与 INSERT 在同一批次中,因此您可能需要将插入编写为:db.QueryValue("INSERT ... SELECT SCOPE_IDENTITY()", param1, param2, etc.)
      • 使用db.QuerySingleoutput 实际上有一种更简单的方法:var db = Database.Open("Test"); var val = "Test param"; var t = db.QuerySingle("insert into Test(TestName) output inserted.TestID as 'InsertedID' values(@0)", val);。然后@t.InsertedID 将为该插入提供插入的 ID。请注意,TestID 是表 Test 中的标识列。我不知道这是否适用于精简版,但是对于精简版@@Identity 来说,在大多数(如果不是全部)场景中使用似乎是安全的。感谢您的帮助!
      • 对不起,我不得不对此投反对票。正如所指出的,我正在使用它,在它应该工作的确切环境中,我没有返回任何数据。对不起。
      • @IVlad 你的评论是有帮助的。感谢您发布!我可以用db.QueryValue() 得到它,但其余部分是一样的。这个答案应该更好地编写了可用的代码。该语句(SELECT SCOPE_IDENTITY() 部分)与插入语句同时包含并执行似乎很重要。没有它,我无法让它返回任何东西。
      【解决方案3】:

      这是我的解决方案

      var db.Database.open('..');
      var lastId = db.GetLastInsertId(); 
      

      【讨论】:

        猜你喜欢
        • 2015-03-01
        • 1970-01-01
        • 2011-07-24
        • 2010-09-29
        • 1970-01-01
        • 2023-02-17
        • 2018-08-07
        相关资源
        最近更新 更多