【发布时间】: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