Выполнение метода для DataContext, возвращающего вставленный идентификатор - PullRequest
1 голос
/ 25 августа 2009

Есть ли способ использовать 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!
}

РЕШЕНИЕ

Этот занял некоторое время. Вы должны передать ссылку на параметр OUTPUT в вашем sproc в список параметров вызывающей функции, например, так:

[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 ]

2 голосов
/ 09 апреля 2010

Вы можете использовать что-то вроде этого:

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

Ключ в том, чтобы преобразовать @@ IDENTITY в тип int, как Бен sugested.

0 голосов
/ 26 августа 2009

Если вы настаиваете на использовании необработанных 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;
}
0 голосов
/ 25 августа 2009

Вам нужно будет изменить оператор вставки, добавив в конце SELECT @@ Identity (SQL Server) или аналогичный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...