【问题标题】:"System.InvalidCastException: Specified cast is not valid" - DateTime“System.InvalidCastException:指定的演员表无效” - DateTime
【发布时间】:2015-11-20 19:11:35
【问题描述】:

我正在更新我网站中的某些字段,出现以下错误:

System.InvalidCastException:指定的强制转换无效。

以及出错的代码是这样的(如错误信息所示):

第 77 行:productObj.QuantityInStock = dt.Rows[0]["QuantityInStock"].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;
        }

在我的数据库中,我也提到了 data-typeDateTime,但为什么还会出现此错误?

我更新的方法如下所示:

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这是我的桌子的图像:

【问题讨论】:

  • Id DateUpdated DateTime 数据库中的字段?可以为空吗?
  • 你错过了最重要的部分。 tblProduct 长什么样子?
  • 请贴出dt.Rows[0]["DateUpdated"]的值
  • 是的,在数据​​库中是 null,@DStanley
  • @AbhishekGhosh:是的。该值将为DbNull.Value,不能转换为DateTime。您应该检查无效性并适当处理。

标签: c# asp.net datetime


【解决方案1】:

DateTime 在 .NET 中不能为空。如果您的数据库可以有空值,那么您可以将 DateUpdated 的类型更改为可以为空的日期/时间 (DateTime?):

productObj.DateUpdated = (DateTime?)(dt.Rows[0]["DateUpdated"] == DBNull.Value ? null : dt.Rows[0]["DateUpdated"]);

或者使用“魔法”值来表示 null:

productObj.DateUpdated = (DateTime)(dt.Rows[0]["DateUpdated"] == DBNull.Value ? DateTime.MinValue : dt.Rows[0]["DateUpdated"]);

【讨论】:

  • DateTime.MinValue 会返回什么?
  • 如您所见,DateUpdated 只能在字段更新时有值。所以我需要没有值或记录更新时的日期时间..?
  • DateTime.MinValueDateTime支持的最早日期——即Jan 1, 0001
  • 如果您可以将DateUpdated 更改为DateTime?,那么您可以将其设置为null。 DateTime 不能有“没有价值”。
  • 当该列中有空值时,我会显示一条自定义消息?所以我不能显示Jan 1, 0001
【解决方案2】:
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"];

【讨论】:

  • 转换为 DateTime.MinValue 失败
  • 我得到这个错误:System.Data.SqlClient.SqlException: Conversion failed when converting the nvarchar value 'System.Web.UI.WebControls.TextBox' to data type int. 在我得到更新查询结果的部分(这是一个int
  • 您是如何设法将“System.Web.UI.WebControls.TextBox”放入数据库字段的?
  • 我没有!我很困惑为什么我会收到这个错误!
  • @AbhishekGhosh - 您正在使用 txtMinQty.ToString();txtInStock.ToString(); 分配两个 prodObj 字段。这些ToString() 调用会生成写入数据库的“System.Web.UI.WebControls.TextBox”。 QuantityInStock 和 MinQuantity 字段应该是整数,作为它们在数据库中的对应列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2023-04-10
  • 2018-02-06
相关资源
最近更新 更多