System.InvalidCastException:指定的强制转换在使用 postgres datareader 的

本文关键字:datareader postgres 转换 InvalidCastException System | 更新日期: 2023-09-27 18:34:27

我正在尝试使用 C# 中的 postgre 从数据库中提取数据并将返回的值放在标签控件中。我一直得到System.InvalidCasaeExeception。数据库字段是一个整数,所以我使用数据读取器来获取值。

这是我的代码

private void Get_Defects()
    {
        NpgsqlConnection conn = Connection.getConnection();
        try
        {
            conn.Open();
            NpgsqlCommand cmd = new NpgsqlCommand("select * from defect where defect_id >= :MinID and defect_id <= :MaxID and location_id = 102 and top_or_bottom = :TopBottom;", conn);
            cmd.Parameters.Add(new NpgsqlParameter("MinID", MinID));
            cmd.Parameters.Add(new NpgsqlParameter("MaxID", MaxID));
            cmd.Parameters.Add(new NpgsqlParameter("TopBottom", TopBottom));
            NpgsqlDataReader dr = cmd.ExecuteReader();
            if (dr.Read())
            {
                lblCrookedPart.Text = dr.GetInt32(12).ToString();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        finally
        {
            conn.Close();
        }
    }
}

不知道为什么它不起作用。我拉了第一个元素,它显示正确。某些数据是整数,但在数据库中具有空值。我尝试了一个带有数据的元素,但出现转换异常错误。请帮忙。

System.InvalidCastException:指定的强制转换在使用 postgres datareader 的

试试这样的事情

NpgsqlDataReader da = default(NpgsqlDataReader);
NpgsqlCommand cmd = new NpgsqlCommand("select * from myTable", GenConnection);
string strVAL = null;
da = cmd.ExecuteReader;
if (da.HasRows) {
    while (da.Read) {
        strVAL = (Information.IsDBNull(da["field"]) ? 0 : da["field"]).ToString;
    }
}

我让它工作了,谢谢大家的帮助和提示!!

这是工作代码的截图

conn.Open();
            NpgsqlDataAdapter da = new NpgsqlDataAdapter("select * from defect where defect_id >= '"+MinID+"' and defect_id <= '"+MaxID+"' and location_id = 102 and top_or_bottom = '"+TopBottom+"';", conn);
            ds.Reset();
            da.Fill(ds);
            dt = ds.Tables[0];
            //Used to sum the column values
            object CrookedPartTotal = dt.Compute("Sum(crooked_part)", "defect_id >= '" + MinID + "' and defect_id <= '" + MaxID + "'");
            if (CrookedPartTotal.ToString() == "")
                lblCrookedPart.Text = "0";
            else
                lblCrookedPart.Text = CrookedPartTotal.ToString();

            object TooMuchSolder = dt.Compute("Sum(too_much_solder)", "defect_id >= '" + MinID + "' and defect_id <= '" + MaxID + "'");
            if (TooMuchSolder.ToString() == "")
                lblTooMuchSolder.Text = "0";
            else
                lblTooMuchSolder.Text = TooMuchSolder.ToString();

您应该检查该值是否不为空。请尝试以下操作:

lblCrookedPart.Text = (dr.IsDBNull(12)) ? "NULL" : dr.GetInt32(12).ToString();