2015-08-01 3 views
2

Я пытаюсь вставить запись с использованием EF6 путем вызова хранимой процедуры и попытки получить результат из хранимой процедуры, которая является новой созданный идентификатор, но продолжать работать в кирпичных стенах.Как выполнить хранимую процедуру и получить вывод из хранимой процедуры с использованием Entity Framework

У меня есть хранимая процедура, которая имеет выход ContactID

CREATE PROCEDURE [dbo].[usp_InsertContact] 
    @ContactID int output, 
    @Name nvarchar(50) 
AS 
insert into [Contact] 
    (Name) values (@Name) 
    set @ContactID = @@IDENTITY 

Я звоню хранимую процедуру и передавая значения, как это ...

return Convert.ToInt32(AWJE.Database.SqlQuery<int> 
    ("usp_InsertContact @Name", contact.Name)); 

Это не сработало Я получил следующую ошибку ... (и я опубликовал это раньше и сам ответил, и это не сработало).

System.Data.Entity.Infrastructure.DbRawSqlQuery`1 [System.Int32] 'типового' System.IConvertible Ошибки

Тогда я пошел и попытался это ...

return AWJE.Database.ExecuteSqlCommand 
    ("exec usp_InsertContact @Name", contact.Name); 

Когда это вызывается я получаю следующее сообщение об ошибке ...

Дополнительная информация: Необходимо объявить скалярную переменную «@name ».

Как вы можете видеть, переменная @Name находится в хранимой процедуре и что я передаю переменную @Name.

Итак, я попытался это

return AWJE.Database.ExecuteSqlCommand 
    ("exec usp_InsertContact @ContactID OUTPUT, @Name", contact.Name); 

И что дает эту ошибку ...

Дополнительная информация: Необходимо объявить скалярную переменную "@ContactID".

Так что я как бы потерялся с тем, как это сделать, я знаю, как это сделать, используя ADO.NET. Я искал ответ для этого, но не понял примеры, которые я видел, потому что примеры, которые я видел, смешиваются с SqlParameter.Add и т. Д.

+0

'this.Database.SqlQuery ("storedProcedureName", Params);' – wiretext

ответ

0

Вместо того, чтобы дать вам подробное описание того, как это сделать шаг за шагом. T

здесь в основном два способа сделать это непосредственно с EF другим с помощью только чистого SQL.

В EF вы должны добавить sproc как функция здесь есть статья о том, как это сделать https://msdn.microsoft.com/en-us/data/gg699321.aspx

или чистый SQL способ, как это так,

SqlParameter p1= new SqlParameter("@p1", "Test"); 
SqlParameter p2 = new SqlParameter("@p2", "Test2"); 

//Executing the stored procedure from your database context 
context.Database.ExecuteSqlCommand("sp_StoredProc @p1, @p2", p1, p2); 
+0

С чистого оператора SQL у вас есть, не это то же самое? AWJE.Database.ExecuteSqlCommand ("usp_InsertContact @Name", contact.Name) ?. Я задал вопрос, похожий на ваше утверждение, которое связано с тем, чтобы сделать его более чистым и элегантным, а то, что я показал, было другим способом, который был более чистым способом сделать это. – Chris

+1

Дополнительная информация: Должен объявить скалярную переменную «@ ContactID». Является причиной, по которой вы получаете ошибку, а не чистым способом, чтобы позволить EF обрабатывать вашу переменную как SqlParameter. Даже вышеприведенный ответ по-прежнему использует параметры SQL, вы можете записать его в одной строке, но сделать что-то вроде этого («exec usp_InsertContact @Name», contact.Name); может даже не запускаться для компиляции. –

0

попробовать

using (ConEntities context = new ConEntities()) 
    { 
    // ContactID is an output parameter. 
    ObjectParameter ContactID = new ObjectParameter("ContactID", typeof(int)); 
    SqlParameter Name = new SqlParameter("@Name", "hello sir"); 
    context.usp_InsertContact(ContactID, Name); 
    //Console.WriteLine(ContactID.Value); 
    } 

Нам также могут понравиться

var parameters = new[] { 
     new SqlParameter("@0", SqlDbType.Int32) { Direction = ParameterDirection.Output }, 
     new SqlParameter("@1", "MY Name") 
    }; 

    context.ExecuteStoreCommand("exec usp_InsertContact @ContactID [email protected] output, @Name [email protected]", parameters); 

    int d = (int)parameters[0].Value; 
+0

Выдает ошибку в context.usp_InsertContact (ContactID, Name) ;, ошибка: «невозможно преобразовать из« System.Data.SqlClient.SqlParameter »в строку« – Chris

+0

@ContactID == @@ IDENTITY не является проблемой , ContactID является столбцом идентификации и увеличивает ID :) – Chris

+0

да, я получил его по ошибке, я положил тогда, я удалил :) второе решение также не работает – wiretext

0

Я делаю это так

var outputId = new SqlParameter { ParameterName = "outputId", Value = 0, Direction = System.Data.ParameterDirection.Output }; 

    Database.ExecuteSqlCommand(
     @"spProcedureName @p1, @outputId out", 
     new SqlParameter("p1", HttpContext.Current.User.Identity.Name), 
     outputId 
    ); 

    return Convert.ToInt32(outputId.Value); 
Смежные вопросы