2014-01-14 4 views
2

У меня есть работающая хранимая процедура, которая работает при вызове из старого ADO.NET. Ниже это:Entity Framework: не удается вызвать хранимую процедуру, неправильное формирование кода

GO 
ALTER procedure [dbo].[GetParentID] 
    @SSHIP_AppID as varchar(50), 
    @ParentID as varchar(150) OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT @ParentID = a.iBuild_GUID 

    FROM dbo.XRef_iBuild_SSHIP as a 
    WHERE a.SSHIP_appId = @SSHIP_AppID 
    AND a.SSHIP_appId <> '' 
END 

В ADO.NET, он принимает APPID и просто возвращает строку ParentID:

private string GetParentId(string appId) 
     { 
      var connection = new SqlConnection(); 
      string parentId = String.Empty; 
      try 
      { 
       connection.ConnectionString = "Data Source="blah..."; 
       var command = new SqlCommand("GetParentId", connection); 

       command.CommandType = CommandType.StoredProcedure; 

       command.Parameters.Add(new SqlParameter("@SSHIP_AppID", appId)); 


       SqlParameter parent = new SqlParameter("@ParentID", SqlDbType.VarChar, 255); 
       parent.Direction = ParameterDirection.Output; 
       command.Parameters.Add(parent); 

       connection.Open(); 

       command.ExecuteNonQuery(); 

       parentId = (command.Parameters["@ParentID"].Value).ToString(); 
      } 
      catch (Exception ex) 
      { 
       Logger.LogError(appId, ex.ToString(), "Interface12 - Cannot get ParentId", null, "", 0, "Interface12"); 
      } 
      finally 
      { 
       connection.Close(); 
      } 
      return parentId; 
     } 

Вот то, что EF генерирует, когда я делаю функции импорта из хранимой процедуры :

public virtual int GetParentID(string sSHIP_AppID, ObjectParameter parentID) 
     { 
      var sSHIP_AppIDParameter = sSHIP_AppID != null ? 
       new ObjectParameter("SSHIP_AppID", sSHIP_AppID) : 
       new ObjectParameter("SSHIP_AppID", typeof(string)); 

      return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("GetParentID", sSHIP_AppIDParameter, parentID); 
     } 

Это правильно? Если да, могу ли я создать пример кода для получения родительского идентификатора? Если нет, то как я могу создать что-то лучше?

+1

Посмотрите в использовании «с использованием()» вокруг SqlConnection и SqlCommand объектов – Quintium

ответ

2

Выбирает меня. Поскольку у вас может быть несколько выходов, а функция C# не может вернуть более одной вещи, она возвращает результат в ObjectParameter. Я считаю, что это единственный способ его создания. Если вы генерируете вызов функции вместо вызова SP, возможно, он сгенерирует его с типом возвращаемого значения (я не пробовал), но это для поддержки нескольких выходных параметров. Если вам нравится, вы можете обернуть эту сгенерированную функцию своей собственной, которая вызывает эту функцию и возвращает значение параметра parentID.

private string GetParentId(string appId) 
{ 
    ObjectParameter parentID = new ObjectParameter("ParentID", typeof(string)); 
    GetParentID(appId, parentID); 
    return parentID.Value.ToString(); 
} 
+0

Спасибо, но, как я работаю с кодом OutputParameter? Можете ли вы показать мне какой-нибудь код, чтобы вывести parentId из него? – user2471435

+0

Обновлено - что-то в этом роде. – Zach

+0

На возврате parentID.Value его объект. Я просто возвращаю parentId.Value.ToString()? – user2471435

Смежные вопросы