как хранить идентификатор в переменной окружения из почтовой операции в почтальоне? - PullRequest
0 голосов
/ 10 апреля 2019

Я не могу установить переменную среды в тесте почтальона.Мое тело ответа показывает только 1 после выполнения операции POST.В заголовке ответа я получаю Transfer-Encoding → chunked, Content-Type → application / json;charset = utf-8 и т. д. Я не совсем уверен, что Transfer-Encoding создает проблему?1010 *

public JsonResult CreateCustomer([FromBody]Customer customer)
    {
        try
        {
            BaseDataAccess baseDataAccess = new BaseDataAccess(_config["ConnectionStrings:DefaultConnection"]);

            List<DbParameter> parametersList = new List<DbParameter>();

            parametersList.Add(baseDataAccess.GetParameter("StatementType", "Insert"));
            parametersList.Add(baseDataAccess.GetParameter("Name", customer.Name));
            parametersList.Add(baseDataAccess.GetParameter("Email", customer.Email));
            parametersList.Add(baseDataAccess.GetParameter("PrimaryPhone", customer.PrimaryPhone));
            parametersList.Add(baseDataAccess.GetParameter("AlternatePhone", customer.AlternatePhone));
            parametersList.Add(baseDataAccess.GetParameter("Address1", customer.Address1));
            parametersList.Add(baseDataAccess.GetParameter("Address2", customer.Address2));
            parametersList.Add(baseDataAccess.GetParameter("Address3", customer.Address3));
            parametersList.Add(baseDataAccess.GetParameter("City", customer.City));
            parametersList.Add(baseDataAccess.GetParameter("State", customer.State));
            parametersList.Add(baseDataAccess.GetParameter("Country", customer.Country));
            parametersList.Add(baseDataAccess.GetParameter("Zip", customer.Zip));

            return Json(baseDataAccess.ExecuteNonQuery("[dbo].[CreateCustomer]", parametersList, CommandType.StoredProcedure));
        }
        catch (Exception e)
        {
            throw e;
        }
    }

1 Ответ

2 голосов
/ 10 апреля 2019

Я подозреваю, что в этом вопросе есть несколько недоразумений. Результат ExecuteNonQuery путается с выходным кодом или результатом хранимой процедуры. return Json(..) передается одно число, но код Javascript ожидает, что ответ будет содержать объект. Environment variable похоже, не имеет никакого отношения к проблеме.

Код Javascript:

var jsonData = JSON.parse(responseBody);
...
.... jsonData.customerId);

Ожидается, что ответ будет содержать строку JSON, содержащую один объект с атрибутом customerId.

Код сервера, однако, возвращает только количество строк:

return Json(baseDataAccess.ExecuteNonQuery("[dbo].[CreateCustomer]", parametersList, CommandType.StoredProcedure));

ExecuteNonQuery возвращает количество строк, затронутых запросом или хранимой процедурой. Вставка одной строки возвращает 1. Она не возвращает результат хранимой процедуры или выходные параметры.

Это означает, что сервер эффективно выполняет это:

return Json(1);

Ответ будет содержать простой 1.

Чтобы вернуть объект JSON с customerId, код должен измениться на:

var newItem=new {customerId=thatNewId;};
return Json(newItem);

Это вернет {'customerId: 1234}, что ожидает Javascript.

Не зная, что делает хранимая процедура, остается только догадываться, как извлечь новый идентификатор. В коде C # нет выходных параметров, поэтому я предполагаю, что идентификатор возвращается в виде одного результата, например, с:

SELECT @@IDENTITY;

Веб-приложение должно использовать ExecuteScalar :

var thatNewId = baseDataAccess.ExecuteScalar("[dbo].[CreateCustomer]", 
                                              parametersList, 
                                              CommandType.StoredProcedure);

Собираем все вместе:

var thatNewId = baseDataAccess.ExecuteScalar("[dbo].[CreateCustomer]", 
                                              parametersList, 
                                              CommandType.StoredProcedure);
var newItem=new {customerId=thatNewId;};
return Json(newItem);

Я просто предположу, что код POSTMAN правильный

...