AJAX POST方法给了我一个日期时间错误,而在方法中并没有任何影响日期的内容



我有一个JavaScript函数,看起来像这个

<script type="text/javascript">
function add() {
var token = $("input[name='__RequestVerificationToken']", "#__AjaxAntiForgeryForm").val();
var parts = [], partsqty = [];
// Get all part ids and quantities and store them in arrays
var partssel = document.getElementsByClassName("Part-select");
var partsqtysel = document.getElementById('Part-qty').value;
for (i = 0; i < partssel.length; i++) {
parts[i] = partssel[i].options[partssel[i].selectedIndex].value;
partsqty[i] = partsqtysel;
if (partsqty[i] < 0) {
alert("Quantities can't be negative!");
return;
}
}
alert("I am an alert box too!");
$.ajax({
type: "POST",
url: "@IGT.baseUrl/JODetailsAjax/AddUnits",
traditional: true,
data: {
__RequestVerificationToken: token,
jo_id: @Model.Id,
addPart_id: parts,
addPart_qty: partsqty
},
success: function (data) {
if (data.success === "False") {
var errorMessage = data.Message;
alert("Error: " + errorMessage);
return;
}
if(data.success === "True"){
location.href = "../JobOrders/Details?id=@Model.Id";
}
},
error: function (jqXHR, status, error) {
alert("Error:" + error);
}
});
}
</script>

它调用我的"AddUnits"函数,看起来像这个

[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult AddUnits(int jo_id, int[] addPart_id, float[] addPart_qty)
{
bool canCreate = true;
string errors = "";
for (int i = 0; i < addPart_id.Length; i++)
{
foreach (JODetails jod in db.JobOrders.Find(jo_id).JODetails)
{                    
if (i < addPart_id.Length && addPart_qty[i] != 0 && jod.PartID == addPart_id[i])
{
jod.part_qty += addPart_qty[i];
addPart_id[i] = 0;
addPart_qty[i] = 0;
}
}
db.SaveChanges();
if (i < addPart_qty.Length && addPart_qty[i] != 0)
{
JODetails jODetails = new JODetails
{
JobOrderID = jo_id
};
// Only add a unit to the JODetails object if it's not null and has an id and quanitity specified              
if (i < addPart_id.Length && addPart_id[i] != 0 && addPart_qty[i] != 0)
{
jODetails.PartID = addPart_id[i];
jODetails.part_qty = addPart_qty[i];
}

JobOrder JO = db.JobOrders.Find(jODetails.JobOrderID);
JODetails jobOrderDetails = db.JODetails.Add(jODetails);
jobOrderDetails.JobOrder = JO;
Part JO_Part = db.Parts.Find(jODetails.PartID);

if (JO_Part != null)
{
jODetails.part_qty = jODetails.part_qty == null ? 0 : jODetails.part_qty;
float qtyOrdered = jODetails.part_qty == null ? 0 : (float)jODetails.part_qty;
jobOrderDetails.dynamicPart_qty = qtyOrdered;
}
if (!canCreate)
{
var errorMessage = string.Join(",", errors);
var stock = new { success = "False", Message = errorMessage };
return Json(stock, JsonRequestBehavior.AllowGet);
}

db.JODetails.Add(jODetails);
}

}
db.SaveChanges(); // error on this line
JobOrder jobOrder = db.JobOrders.Find(jo_id);
bool hasParts = false;

foreach (JODetails jod in jobOrder.JODetails)
{
if (jod.Parts != null && jod.part_qty > 0)
hasParts = true;
}
ViewBag.hasParts = hasParts;
var result = new { success = "True" };
return Json(result);
}

但每次它通过该方法时,db.SaveChanges();都会出现错误,显示

SqlException:将datetime2数据类型转换为datetime数据类型导致值超出范围

正如你所看到的,我的代码中甚至没有引用日期,所以我不确定为什么会出现这个问题?我在网上搜索过答案,但每个人似乎都在处理他们遇到这个问题的日期。

感谢您的帮助。

要最有效地调试问题,请首先检查数据库表。

现在检查以下情况:

  • 是否包含日期列
  • 如果是,列是否可以为null

如果数据库表中有不可为null的列,则在尝试保存新数据时可能会遇到错误,该数据不包含日期列的信息(即null值(,或者它可能希望接受格式错误的日期列的默认值。


对上述代码的一些一般建议:

  • 您不需要有那么多db.SaveChanges()调用,对我来说,第一次和最后一次保存更改的调用是多余的
  • 更喜欢使用foreach语句而不是for,尤其是在不需要为特定操作使用索引的情况下
  • 不要在迭代中使用复杂的表达式,有时它们会产生无法预测的结果,或者在数据更改时触发异常

C#DateTime对象是"较大的";而不是SQL的smalldatetime类型如何修复";SqlException:将datetime2数据类型转换为datetime数据类型导致值超出范围">

相关内容

最新更新