对DataContext执行方法返回插入的ID

时间:2009-08-25 15:54:48

标签: asp.net-mvc datacontext

有没有办法使用DataContext执行一些显式SQL并使用ExecuteMethodCall返回插入行的自动增量主键值而不用?我想要做的就是将一些数据插入到表中并获取新创建的主键,但不使用LINQ(我在查询中使用显式SQL,只使用LINQ对数据建模)。

干杯

编辑:基本上,我想这样做:

public int CreateSomething(Something somethingToCreate)
{
    string query = "MyFunkyQuery";
    this.ExecuteCommand(query);
    // return back the ID of the inserted value here!
}

这个花了一段时间。您必须在调用函数的参数列表中传递sproc中OUTPUT参数的引用,如下所示:

[Parameter(Name = "InsertedContractID", DbType = "Int")] ref System.Nullable<int> insertedContractID

然后你必须做

insertedContractID = ((System.Nullable<int>)(result.GetParameterValue(16)));

一旦你打电话给它。然后你可以在它之外使用它:

public int? CreateContract(Contract contractToCreate)
{
   System.Nullable<int> insertedContractID = null; ref insertedContractID);
   return insertedContractID;
} 

请注意GetParameterValue(16)。它被索引到参数列表中的任何参数(顺便说一下,这不是完整的代码)。

3 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

int newID = myDataContext.ExecuteQuery<int>(
    "INSERT INTO MyTable (Col1, Col2) VALUES ({0}, {1});
     SELECT Convert(Int, @@IDENTITY)",
     val1, val2).First();

关键是在类型int中转换@@ IDENTITY,就像Ben sugested。

答案 1 :(得分:0)

您需要修改insert语句,以在最后包含SELECT @@ Identity(SQL Server)或类似内容。

答案 2 :(得分:0)

如果您坚持使用原始SQL查询,那么为什么不使用sprocs进行插入?您可以通过输出参数获取返回的标识。

我不是SQL上最伟大的,但我打破了LinqPad并提出了这个问题。在我看来,这是一个很大的黑客攻击,但它确实有点......有点。

DataContext.ExecuteQuery<T>()返回IEnumerable<T>,其中T是映射的linq实体。我添加的额外选择只会填充YourPrimaryKey属性。

public int CreateSomething(Something somethingToCreate)
{
// sub out your versions of YourLinqEntity & YourPrimaryKey
    string query = "MyFunkyQuery" + "select Convert(Int, SCOPE_IDENTITY()) as [YourPrimaryKey]";
    var result = this.ExecuteQuery<YourLinqEntity>(query);
    return result.First().YourPrimaryKey;
}