Asp.net 如何使用WebMatrix获取插入的行ID

Asp.net 如何使用WebMatrix获取插入的行ID,asp.net,sql,sql-server,razor,webmatrix,Asp.net,Sql,Sql Server,Razor,Webmatrix,WebMatrix中有一种方法。但是,使用Reflector,我可以看到它的实现方式如下: [return: Dynamic] public object GetLastInsertId() { return this.QueryValue("SELECT @@Identity", new object[0]); } 据我所知,这是一种非常糟糕的方法,因为@@Identity返回考虑到每个表和每个会话的最后一次插入。我需要将它限制在我正在使用的范围和会话中,因此我希望它使用选择范围\u

WebMatrix中有一种方法。但是,使用Reflector,我可以看到它的实现方式如下:

[return: Dynamic]
public object GetLastInsertId()
{
    return this.QueryValue("SELECT @@Identity", new object[0]);
}
据我所知,这是一种非常糟糕的方法,因为
@@Identity
返回考虑到每个表和每个会话的最后一次插入。我需要将它限制在我正在使用的范围和会话中,因此我希望它使用
选择范围\u IDENTITY()
,因为根据我的阅读,这似乎也是最常用的

我的问题是:

  • WebMatrix包装器是否可以在我的案例中使用
  • 如果没有,是否有一种简单的方法可以使用WebMatrix类获取插入查询的插入ID,或者我应该使用像SqlClient这样的东西来实现这一点
  • 我对SQL Server(不是compact)的答案感兴趣,如果这有什么不同的话。

    引用WebMatrix中数据API的一位开发人员的话:“[SCOPE\u idenity]不适用于ce”。因为我们需要一个既能在CE上工作又能在常规SQL Server上工作的数据API,所以我们使用了@Identity。因此,如果您想专门使用SCOPE_IDENTITY,应该使用db.QueryValue方法:

    var db = Database.Open(...);
    db.Insert(...);
    var lastInsertId = db.QueryValue("SELECT SCOPE_IDENTITY()")
    
    引用WebMatrix中数据API的一位开发人员的话:“[SCOPE\u idenity]在ce上不起作用”。因为我们需要一个既能在CE上工作又能在常规SQL Server上工作的数据API,所以我们使用了@Identity。因此,如果您想专门使用SCOPE_IDENTITY,应该使用db.QueryValue方法:

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

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

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

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

      var db=Database.Open(...);
      var lastInsertID = db.QueryValue("INSERT name into Names; SELECT SCOPE_IDENTITY()");
    
    这是我的解决办法

    var db.Database.open('..');
    var lastId = db.GetLastInsertId(); 
    
    这是我的解决办法

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

    哦,那就有道理了。
    SCOPE\u IDENTITY()
    是否会按照您编写的方式正常工作?我有点困惑,因为我看到一些开发人员说应该在存储过程中使用它,尽管上面的MSDN页面没有使用存储过程。老实说,我不是100%确定,您可能需要进行测试。可能作用域标识必须与INSERT在同一批中,因此您可能需要将INSERT编写为:db.QueryValue(“INSERT…SELECT SCOPE\u IDENTITY()”,param1,param2,等等)。实际上,使用
    db.QuerySingle
    输出
    var db=Database.Open(“Test”);var val=“测试参数”;var t=db.QuerySingle(“插入测试(TestName)输出inserted.TestID作为'InsertedID'值(@0)”,val)。然后
    @t.InsertedID
    将给出插入的ID。请注意,
    TestID
    是表
    Test
    中的标识列。我不知道这在compact版中是否有效,但是对于compact
    @@Identity
    ,在大多数(如果不是全部)场景中使用似乎是安全的。谢谢你的帮助!对不起,我不得不投反对票。正如我所指出的,我正在使用它,在它应该工作的确切环境中,我没有得到返回的数据。对不起。@IVlad,你的评论才是有用的。谢谢你的发帖!我可以通过
    db.QueryValue()
    获得它,但它的其余部分是相同的。这个答案应该能更好地编写可用的代码。与insert语句同时包含并执行此语句(SELECT SCOPE_IDENTITY()
    部分)似乎很重要。没有它我什么都不能退。哦,那就有道理了。
    SCOPE\u IDENTITY()
    是否会按照您编写的方式正常工作?我有点困惑,因为我看到一些开发人员说应该在存储过程中使用它,尽管上面的MSDN页面没有使用存储过程。老实说,我不是100%确定,您可能需要进行测试。可能作用域标识必须与INSERT在同一批中,因此您可能需要将INSERT编写为:db.QueryValue(“INSERT…SELECT SCOPE\u IDENTITY()”,param1,param2,等等)。实际上,使用
    db.QuerySingle
    输出
    var db=Database.Open(“Test”);var val=“测试参数”;var t=db.QuerySingle(“插入测试(TestName)输出inserted.TestID作为'InsertedID'值(@0)”,val)。然后
    @t.InsertedID
    将给出插入的ID。请注意,
    TestID
    是表
    Test
    中的标识列。我不知道这在compact版中是否有效,但是对于compact
    @@Identity
    ,在大多数(如果不是全部)场景中使用似乎是安全的。谢谢你的帮助!对不起,我不得不投反对票。正如我所指出的,我正在使用它,在它应该工作的确切环境中,我没有得到返回的数据。对不起。@IVlad,你的评论才是有用的。谢谢你的发帖!我可以通过
    db.QueryValue()
    获得它,但它的其余部分是相同的。这个答案应该能更好地编写可用的代码。与insert语句同时包含并执行此语句(SELECT SCOPE_IDENTITY()
    部分)似乎很重要。没有它,我无法让它归还任何东西。