【问题标题】:C # Object cannot be cast from DBNull to other typesC# 对象不能从 DBNull 转换为其他类型
【发布时间】:2013-09-29 07:31:05
【问题描述】:

对象不能从 DBNull 转换为其他类型。

我有一个引发上述错误的函数。我正在处理我的数据库和 C# 代码中的所有空值。 那么它是从哪里得到这个错误的呢?

我可以在 catch 块中看到错误。但我不明白以下 create() 中的哪一行出现错误。

    private void btnsearch_Click(object sender, EventArgs e)
    {
        try
        {
            dt.Rows.Clear();
            SqlConnection CN = new SqlConnection(mysql.CON.ConnectionString);
                SqlDataAdapter sda = new SqlDataAdapter("select EMP_EMPLOYEES.NAME,EMP_EMPLOYEES.JOBNAME,EMP_EMPLOYEES.FIA,EMP_EMPLOYEES.DRAGA,EMP_EMPLOYEES.SALARY ,EMP_HASM_DET.GZA,EMP_EMPLOYEES.NAQLBADAL,EMP_EMPLOYEES.JOBBADALAT ,BLADIAINFO.MA3ESHA ,EMP_EMPLOYEES.DISSENT ,EMP_EMPLOYEES.SANDOK as'الصندوق' from  BLADIAINFO ,EMP_EMPLOYEES left join EMP_HASM_DET on EMP_HASM_DET.EMPID = EMP_EMPLOYEES.ID  left join EMP_MOKHALFAT_DET on EMP_MOKHALFAT_DET.EMPID = EMP_EMPLOYEES.ID  left join EMP_MOKHALFAT on EMP_MOKHALFAT.ID=EMP_MOKHALFAT_DET.MOKHALFAID left join EMP_HASMIAT on EMP_HASMIAT.ID=EMP_HASM_DET.HASMID   and EMP_EMPLOYEES.EMPTYPE = '" + cmbEMPTYPE.SelectedItem.ToString() + "' ", CN);
                sda.Fill(dt);
            }
            ////////////
            dt.Columns.Add("Actual_salary", typeof(string));

            foreach (DataRow dr in dt.Rows)
            {
                int GZA = dr["GZA"] == null ? 0 : Convert.ToInt32(dr["GZA"]);
                dr["Actual_salary"] = Convert.ToInt32(dr["SALARY"]) - ((Convert.ToInt32(dr["SALARY"]) / 30) * GZA);

            }
            dataGridViewX1.DataSource = dt;

【问题讨论】:

  • 试试int GZA=dr["GZA"] == DBNull.Value.Equals(dr["GZA"]) ? 0 : Convert.ToInt32(dr["GZA"]);

标签: c# sql


【解决方案1】:

在将其转换为另一种类型之前,您需要检查您的列是否具有空值。当您使用 null 进行检查时,但 dr["GZA"] 不会为 null,因此您需要使用 DBNull.Value 进行检查

试试这个

foreach (DataRow dr in dt.Rows)
{
    int GZA = (dr["GZA"] == DBNull.Value) ? 0 : Convert.ToInt32(dr["GZA"]);
    if (dr["SALARY"] != DBNull.Value)
    {
        dr["Actual_salary"] = Convert.ToInt32(dr["SALARY"]) - ((Convert.ToInt32(dr["SALARY"]) / 30) * GZA);
    }
}

【讨论】:

  • 你的意思是DBNull而不是DB.Null吗?
  • @Tim 是的,我错过了。 :)
  • 我可以知道拒绝投票的原因吗?这可能对我有帮助:)
  • 唉,SO 不强制执行反对意见的评论/理由政策。我希望这样做,因为有时被否决的人可以从中吸取教训。
【解决方案2】:

你可以在一行中使用它:

int salary = reader["SALARY"] as int? ?? 0;

dr["Actual_salary"] = salary  - ((salary/30) * GZA);

您可以为 DBNull 结果输入 0 或任何值。

【讨论】:

    【解决方案3】:
        private static string MyToString(object o)
        {
            if (o == DBNull.Value || o == null)
                return "";
    
            return o.ToString();
        }
    

    转换为十进制:

    spinHOInvAmt.Value = Convert.ToDecimal(dr["HOInvAmount"] == DBNull.Value ? 0 : dr["HOInvAmount"]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      相关资源
      最近更新 更多