MVC4: хранимая процедура с несколькими параметрами

Использование Visual Studio Express 2012, веб-приложения MVC4 и SQL 2008 R2 ...

Раньше у меня была хранимая процедура, которая принимала только один параметр, и когда моя модель MVC включала эту хранимую процедуру, я мог успешно вызвать ее из моего Controller и получить Json результаты.

Теперь я обновил хранимую процедуру, чтобы она могла принимать два параметра. Я обновил свою модель MVC, но не могу правильно вызвать хранимую процедуру из моего контроллера при передаче двух параметров.

Вот моя старая хранимая процедура и контроллер, использующие один параметр (это работает):

PROCEDURE [dbo].[GetDependencyNodes]     
@CISearchString nvarchar(100)

Старый контроллер:

namespace CMDB.Controllers
{
public class GoJSDiagramNodesAndLinksController : Controller
{
   private CMDBEntities db = new CMDBEntities();
   public ActionResult GetDependencyNodes(string CISearchString)
    {
        return Json(db.GetDependencyNodes(CISearchString).ToList(), JsonRequestBehavior.AllowGet);
    }
}
}

Вот моя новая хранимая процедура и контроллер, принимающие два параметра:

PROCEDURE [dbo].[GetDependencyNodes]
@CISearchString nvarchar(100),
@ExcludeString nvarchar(100)

Новый контроллер:

namespace CMDB.Controllers
{
public class GoJSDiagramNodesAndLinksController : Controller
{
   private CMDBEntities db = new CMDBEntities();
   public ActionResult GetDependencyNodes(string CISearchString, string ExcludeString)
    {
   return Json(db.GetDependencyNodes(CISearchString, ExcludeString).ToList(), JsonRequestBehavior.AllowGet);
    }
}
}

В Visual Studio Express 2012 я получаю сообщение об ошибке в строке «return Json»:

'int' не содержит определения для 'ToList', и не удалось найти метод расширения 'ToList', принимающий первый аргумент типа 'int'.

Если я изменю строку с:

return Json(db.GetDependencyNodes(CISearchString, ExcludeString).ToList(), JsonRequestBehavior.AllowGet);

to:

return Json(db.GetDependencyNodes(CISearchString, ExcludeString).ToString().ToList(), JsonRequestBehavior.AllowGet);

Ошибка исчезает, но контроллер возвращает -1 вместо правильных результатов Json. Я протестировал хранимую процедуру в SQL Manager и вижу ожидаемые результаты.

Вот частичный код из моего файла CMDBModels.Desginer.cs с GetDependencyNodes:

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    /// <param name="cISearchString">No Metadata Documentation available.</param>
    /// <param name="excludeString">No Metadata Documentation available.</param>
    public int GetDependencyNodes(global::System.String cISearchString, global::System.String excludeString)
    {
        ObjectParameter cISearchStringParameter;
        if (cISearchString != null)
        {
            cISearchStringParameter = new ObjectParameter("CISearchString", cISearchString);
        }
        else
        {
            cISearchStringParameter = new ObjectParameter("CISearchString", typeof(global::System.String));
        }

        ObjectParameter excludeStringParameter;
        if (excludeString != null)
        {
            excludeStringParameter = new ObjectParameter("ExcludeString", excludeString);
        }
        else
        {
            excludeStringParameter = new ObjectParameter("ExcludeString", typeof(global::System.String));
        }

        return base.ExecuteFunction("GetDependencyNodes", cISearchStringParameter, excludeStringParameter);
    }

Любые идеи?

Спасибо.


person user2166281    schedule 13.03.2013    source источник
comment
Компилятор не лжет - GetDependencyLinks возвращает целое число, что, как я полагаю, является корнем проблемы.   -  person w.brian    schedule 13.03.2013
comment
Кажется, мой синтаксис для вызова хранимой процедуры GetDependencyLinks верен при передаче двух параметров? Я не уверен, почему изменение этого параметра с одного на два приведет к тому, что ToList () выдаст эту ошибку.   -  person user2166281    schedule 13.03.2013
comment
Невозможно сказать, как вы на самом деле передаете параметры в хранимую процедуру, потому что это на самом деле выполняется методом GetDependencyLinks. Можете ли вы опубликовать код в методе GetDependencyLinks?   -  person w.brian    schedule 13.03.2013
comment
Я сделал ошибку и скопировал в исходное сообщение неправильную хранимую процедуру. В сообщении должно было быть GetDependencyNodes. Я отредактировал сообщение.   -  person user2166281    schedule 13.03.2013
comment
Я также отредактировал свое исходное сообщение, добавив в его нижнюю часть метод GetDependencyNodes.   -  person user2166281    schedule 13.03.2013
comment
Вы заставили меня взглянуть на старый и новый файлы Designer.cs, и я заметил, что автоматически созданный файл изменил методы с ObjectResult на Int для всех моих хранимых процедур с двумя параметрами вместо одного. У меня всего 7 хранимых процедур, 4 из которых используют два параметра. Все 4 из них теперь имеют общедоступный int вместо общедоступного ObjectResult. Интересно, почему он решил создать их именно так, когда я воссоздал свою модель. Я постараюсь разобраться в этом.   -  person user2166281    schedule 13.03.2013
comment
Кажется, это моя проблема. Не уверен, почему моя модель создается таким образом, когда моя хранимая процедура имеет два параметра вместо одного. Моя модель создается из базы данных. Я пытаюсь применить обновление 1 для Visual Studio Express 2012, чтобы посмотреть, не изменится ли это поведение.   -  person user2166281    schedule 13.03.2013
comment
Установка обновления 1 для Visual Studio Express 2012 не устранила мою проблему. Я не понимаю, почему он решил сделать мой метод int вместо ObjectResult. Какие-либо предложения?   -  person user2166281    schedule 14.03.2013
comment
Вы используете Entity Framework?   -  person w.brian    schedule 14.03.2013


Ответы (1)


Сначала нужно сделать пару вещей, чтобы переместить ваш доступ к данным в другой класс, сделайте ваш контроллер как можно более легким.

Затем сопоставьте ваши сохраненные выходные данные с базовым классом, свойства которого соответствуют возвращаемым столбцам (класс сущности)

это должно позволить вам намного упростить просмотр возвращаемых данных при отладке и является просто хорошей практикой программирования.

person Bob The Janitor    schedule 13.03.2013