【问题标题】:How to debug null object field value on ExecuteNonQuery?如何在 ExecuteNonQuery 上调试空对象字段值?
【发布时间】:2016-09-07 10:36:57
【问题描述】:

我已将一个包含多个字段值的类型化对象传递给一个调用 Insert 存储过程的 SQL 命令。在调试时,我可以看到每个字段都有一个值,并且没有一个为空。

但是当我进一步调试db.ExecuteNonQuery 调用时,我得到一个SQL 异常,指出Application 字段为空。虽然在执行这个命令之前它不是 null 并且有一个字符串值。

我检查了通常的调试步骤,模型字段类型与DbCommand 中的类型匹配。我还在执行查询之前检查了escalation.Application 值,该查询按预期填充了字符串值。

问题:

有谁知道为什么ExecuteNonQuery 上的字段值被评估为空?

代码:

  • DAL 类 -

    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>
    

【问题讨论】:

  • 你的存储过程是什么样的(create_escalation)?您似乎正确地使用了 AddInParameters 和 ExecuteNonQuery 并且您已经声明您在实际将值传递给过程之前获得了 Application 的值。另外,您得到的关于 Application 为 NULL 的确切错误是什么?
  • 如果您要提供存储过程代码,请确保您展示的内容足够多以获得正确答案,但也要确保删除所有敏感信息。

标签: c# sql sql-server mode executenonquery


【解决方案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);

它应该可以工作。

【讨论】:

  • 我能看到的唯一其他解释是存储过程参数名称与数据访问层中的名称不匹配。
  • @roryap 你确定它可以在没有@ 的情况下工作吗?如果存在与参数名称相同的列,查询分析器可能会感到困惑,因为它没有以任何方式标记为参数...
  • @PhilDulac 你对这个关于数据阅读器的问题有什么想法吗? stackoverflow.com/questions/37211894/…
猜你喜欢
  • 2019-04-08
  • 2018-01-09
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多