Как отладить значение поля нулевого объекта в ExecuteNonQuery?

Я передал типизированный объект, содержащий несколько значений полей, в команду SQL, которая вызывает хранимую процедуру Insert. При отладке я вижу, что каждое из полей имеет значение, и ни одно из них не равно нулю.

Но когда я продолжаю отлаживать вызов db.ExecuteNonQuery, я получаю исключение SQL, указывающее, что поле приложения пустое. Хотя он не равен нулю и имеет строковое значение до выполнения этой команды.

Я проверил обычные шаги отладки, тип поля модели соответствует типу в файле DbCommand. Также я проверил значение escalation.Application перед выполнением запроса, который заполняется строковым значением, как и ожидалось.

Вопрос:

Кто-нибудь знает, почему значение поля оценивается как нулевое на ExecuteNonQuery?

Код:

  • ДАЛ класс -

    public bool InsertWebReq(Escalation escalation)
    {
        Database db = null;
        string sqlCommand = "";
    
        try
        {
            DatabaseProviderFactory factory = new DatabaseProviderFactory();
            db = factory.Create("NOTIFICATION");
    
            sqlCommand = "CREATE_ESCALATION";
    
            using (DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand))
            {
                db.AddInParameter(dbCommand, "Application", DbType.String, escalation.Application);
                db.AddInParameter(dbCommand, "EM", DbType.String, escalation.EM);
                db.AddInParameter(dbCommand, "EscalationActions", DbType.String, escalation.EscalationActions);
                db.AddInParameter(dbCommand, "ProblemStatement", DbType.String, escalation.ProblemStatement);
                db.AddInParameter(dbCommand, "status", DbType.String, escalation.status);
                db.AddInParameter(dbCommand, "UpdatedBy", DbType.String, escalation.UpdatedBy);
                db.AddInParameter(dbCommand, "UpdatedTime", DbType.DateTime, escalation.UpdatedTime);
                db.AddInParameter(dbCommand, "Impact", DbType.String, escalation.Impact);
    
                db.ExecuteNonQuery(dbCommand);
                return true;
            }
        }
        catch (SqlException ex)
        {
            //Log the SQL specific errors
            for (int i = 0; i < ex.Errors.Count; i++)
            {
                StringBuilder errorMessages = new StringBuilder();
    
                errorMessages.Append("Index #" + i + "\n" +
                    "Message: " + ex.Errors[i].Message + "\n" +
                    "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                    "Source: " + ex.Errors[i].Source + "\n" +
                    "Procedure: " + ex.Errors[i].Procedure + "\n");
            }
    
            MyLogger.FileLogger.ErrorFormat("{0} - {1}", sqlCommand, ex.Message);
            return false;
        }
    }
    
  • Модель -

    public partial class Escalation
    {
        public int ID { get; set; }
        public string Application { get; set; }
        public string EM { get; set; }
        public string status { get; set; }
        public string ProblemStatement { get; set; }
        public string Impact { get; set; }
        public string EscalationActions { get; set; }
        public System.DateTime UpdatedTime { get; set; }
        public string UpdatedBy { get; set; }
    }
    
  • HTML-элемент списка приложений -

                            <div class="form-adjacent">
                                <label class="col-md-3 control-label" for="App">App</label>
                                <div class="col-md-8">
                                    <select id="App" name="Application" onchange="" class="form-control">
                                        <option value="SAP">SAP</option>
                                        <option value="EME">EME</option>
                                    </select>
                                </div>
                            </div>
    

person Brian J    schedule 11.05.2016    source источник
comment
Как выглядит ваш сохраненный процесс (create_escalation)? Похоже, вы правильно используете AddInParameters и ExecuteNonQuery, и вы уже заявили, что получаете значение для приложения, прежде чем фактически передать значения в процедуру. Также какую именно ошибку вы получаете о том, что Application является NULL?   -  person Dresden    schedule 11.05.2016
comment
Если вы должны предоставить код хранимой процедуры, убедитесь, что вы показали достаточно, чтобы получить правильный ответ, но также обязательно удалите любую конфиденциальную информацию.   -  person PhilDulac    schedule 11.05.2016


Ответы (1)


Обычно параметры базы данных должны начинаться с @. Итак, если вы измените свой код для этого:

db.AddInParameter(dbCommand, "@Application", DbType.String, escalation.Application);
db.AddInParameter(dbCommand, "@EM", DbType.String, escalation.EM);
db.AddInParameter(dbCommand, "@EscalationActions", DbType.String, escalation.EscalationActions);
db.AddInParameter(dbCommand, "@ProblemStatement", DbType.String, escalation.ProblemStatement);
db.AddInParameter(dbCommand, "@status", DbType.String, escalation.status);
db.AddInParameter(dbCommand, "@UpdatedBy", DbType.String, escalation.UpdatedBy);
db.AddInParameter(dbCommand, "@UpdatedTime", DbType.DateTime, escalation.UpdatedTime);
db.AddInParameter(dbCommand, "@Impact", DbType.String, escalation.Impact);

Он должен работать.

person PhilDulac    schedule 11.05.2016
comment
Единственное другое объяснение, которое я вижу, заключается в том, что имена параметров хранимой процедуры не совпадают с именами на уровне доступа к данным. - person PhilDulac; 11.05.2016
comment
@roryap вы уверены, что это будет работать без @? анализатор запросов может запутаться, если есть столбец с таким же именем параметра, так как он никак не помечен как параметр... - person Gusman; 11.05.2016
comment
@PhilDulac У вас есть идеи по этому вопросу относительно чтения данных? stackoverflow.com/ вопросы/37211894/ - person Brian J; 13.05.2016