我正在更新我网站上的某些字段,我收到以下错误:
System.InvalidCastException:指定的强制转换无效。
错误的代码(如错误消息所示):
第77行:productObj.QuantityInStock = dt.Rows [0] [" QuantityInStock&#34]。的ToString();
第78行:productObj.MinQuantity = dt.Rows [0] [" MinQuantity"]。ToString();
第79行:productObj.DateUpdated =(DateTime)dt.Rows [0] [" DateUpdated"]; //这是错误发生的地方
第80行:productObj.DateCreated =(DateTime)dt.Rows [0] [" DateCreated"];
第81行:}
我的更新查询是这样的:
public int Update(Product obj)
{
string query = "update tblProduct set ProdName=@pname,ProdDescription=@pdesc,ProdSize=@psize,ProdPrice=@pprice,QuantityInStock=@qis,MinQuantity=@mq WHERE ProductID=@pid";
List<SqlParameter> lstParams = new List<SqlParameter>();
lstParams.Add(new SqlParameter("@pid", obj.ProductID));
lstParams.Add(new SqlParameter("@pname", obj.ProdName));
lstParams.Add(new SqlParameter("@pprice", obj.ProdPrice));
lstParams.Add(new SqlParameter("@pdesc", obj.ProdDescription));
lstParams.Add(new SqlParameter("@psize", obj.ProdSize));
lstParams.Add(new SqlParameter("@qis", obj.QuantityInStock));
lstParams.Add(new SqlParameter("@mq", obj.MinQuantity));
return DBUtility.ModifyData(query, lstParams);
}
Product
类如下所示:
public class Product : IModel
{
public int ProductID;
public string ProdName;
public string ProdDescription;
public string ProdSize;
public string ProdPrice;
public int CompanyID;
public string ProdPhoto;
public string QuantityInStock;
public string MinQuantity;
public int CategoryID;
public DateTime DateCreated;
public DateTime DateUpdated;
}
此方法出现错误:
public Product SelectByID(int ID)
{
string query = "select * from tblProduct where ProductID=@pid";
List<SqlParameter> lstParams = new List<SqlParameter>();
lstParams.Add(new SqlParameter("@pid", ID));
DataTable dt = DBUtility.SelectData(query, lstParams);
Product productObj = new Product();
if (dt.Rows.Count > 0)
{
productObj.ProdName = dt.Rows[0]["ProdName"].ToString();
productObj.ProdDescription = dt.Rows[0]["ProdDescription"].ToString();
productObj.CompanyID = Convert.ToInt32(dt.Rows[0]["CompanyID"]);
productObj.ProductID = Convert.ToInt32(dt.Rows[0]["ProductID"]);
productObj.CategoryID = Convert.ToInt32(dt.Rows[0]["CategoryID"]);
productObj.ProdSize = dt.Rows[0]["ProdSize"].ToString();
productObj.ProdPrice = dt.Rows[0]["ProdPrice"].ToString();
productObj.QuantityInStock = dt.Rows[0]["QuantityInStock"].ToString();
productObj.MinQuantity = dt.Rows[0]["MinQuantity"].ToString();
productObj.DateUpdated = (DateTime)dt.Rows[0]["DateUpdated"]; //This where error comes
productObj.DateCreated = (DateTime)dt.Rows[0]["DateCreated"];
}
return productObj;
}
在我的数据库中我也提到数据类型为 DateTime
,为什么会出现此错误?
我更新的方法如下:
protected void btnUpdate_Click(object sender, EventArgs e)
{
Product prodObj = new ProductLogic().SelectByID(Convert.ToInt32(Request.QueryString["ID"]));
prodObj.ProdName = txtName.Text;
prodObj.ProdPrice = txtPrice.Text;
prodObj.ProdDescription = txtDesc.Text;
prodObj.MinQuantity = txtMinQty.ToString();
prodObj.QuantityInStock = txtInStock.ToString();
prodObj.ProductID = Convert.ToInt32(Request.QueryString["ID"]);
int updateResult = new ProductLogic().Update(prodObj);
if (updateResult > 0)
{
lblUpdateRes.Text = "Detail(s) updated successfully!";
lblUpdateRes.ForeColor = System.Drawing.Color.Green;
}
else
{
lblUpdateRes.Text = "There was some error while updating your detail(s). Please try again later!";
lblUpdateRes.ForeColor = System.Drawing.Color.Red;
}
}
有任何想法/建议吗?
编辑:1 以下是我桌子的图片:
答案 0 :(得分:3)
DateTime
在.NET中不能为null。如果您的数据库可以包含空值,那么您可以将DateUpdated
的类型更改为可以为空的日期/时间(DateTime?
):
productObj.DateUpdated = (DateTime?)(dt.Rows[0]["DateUpdated"] == DBNull.Value ? null : dt.Rows[0]["DateUpdated"]);
或使用“magic”值表示null:
productObj.DateUpdated = (DateTime)(dt.Rows[0]["DateUpdated"] == DBNull.Value ? DateTime.MinValue : dt.Rows[0]["DateUpdated"]);
答案 1 :(得分:1)
productObj.DateUpdated = Convert.IsDBNull(dt.Rows[0]["DateUpdated"])?
DateTime.MinValue : (DateTime)dt.Rows[0]["DateUpdated"];
或者,如果productObj.DateUpdated
可以为DateTime?
,则
if (!Convert.IsDBNull(dt.Rows[0]["DateUpdated"]))
productObj.DateUpdated.Value = (DateTime)dt.Rows[0]["DateUpdated"];