Postgresql插入C#后出现强制转换异常

本文关键字:转换 异常 插入 Postgresql | 更新日期: 2023-09-27 17:59:45

使用此代码,我在与参数categoryName相对应的表中搜索id。如果不存在,我在表中插入值,然后返回键。当执行long idCategory = (long) id;时,有时它会工作,有时会引发无效的强制转换异常。为什么???

    public static long GetCategoryID(String categoryName)
    {
        using (NpgsqlConnection conn = new   NpgsqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ToString()))
        {
            conn.Open();
            NpgsqlTransaction transaction = conn.BeginTransaction();

            String query = "SELECT idcategory FROM category WHERE categoryname = '" + categoryName + "';";
            NpgsqlCommand cmd = new NpgsqlCommand(query, conn, transaction);

            object id = cmd.ExecuteScalar();
            if (id == null)
            {
                query = "INSERT INTO Category (categoryname) VALUES ('" + categoryName +"');";
                cmd = new NpgsqlCommand(query, conn, transaction);
                cmd.ExecuteNonQuery();
                query = "SELECT LASTVAL();";
                cmd = new NpgsqlCommand(query, conn, transaction);
                id = cmd.ExecuteScalar();
            }
            long idCategory = (long)id;
            transaction.Commit();
            conn.Close();
            return idCategory;
        }
    }

Postgresql插入C#后出现强制转换异常

首先,请使用调试器检查发生异常的id的值,这可能有助于找到问题。

此外,检查id的类型和表"类别"中列"数据类别"的数据类型也许这些数据类型之间存在差异,从而导致异常。

也可能是,'idcategory'不是自动插入的,所以您必须将其包含在INSERT-语句中。('SELECT LASTVAL()'是否返回null?)

除此之外,我总是更喜欢long idCategory = Convert.ToInt64(id)而不是long idCategory = (long)id

如果要避免异常,请使用long idCategory = id as long并检查idCategory == null 是否