" System.InvalidCastException:指定的强制转换无效" - 约会时间

时间:2015-08-26 16:21:35

标签: c# asp.net datetime

我正在更新我网站上的某些字段,我收到以下错误:

  

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 以下是我桌子的图片:

enter image description here

2 个答案:

答案 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"];