C# 带C的Postgresql插入后的强制转换异常

C# 带C的Postgresql插入后的强制转换异常,c#,.net,postgresql,C#,.net,Postgresql,使用此代码,我在与参数categoryName对应的表中搜索id。如果不存在,则在表中插入值,然后返回键。 执行时长id类别=长id;,有时它可以工作,有时抛出无效的强制转换异常。为什么 public static long GetCategoryID(String categoryName) { using (NpgsqlConnection conn = new NpgsqlConnection(ConfigurationManager.Connectio

使用此代码,我在与参数categoryName对应的表中搜索id。如果不存在,则在表中插入值,然后返回键。 执行时长id类别=长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;
        }
    }

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

此外,请检查表“category”中“idcategory”列的id类型和数据类型。这些数据类型之间可能存在差异,从而导致异常

也可能是“idcategory”不是自动插入的,所以您必须在INSERT语句中包含它。“SELECT LASTVAL”是否返回null

除此之外,我总是更喜欢long idCategory=Convert.ToInt64id而不是long idCategory=longid

如果要避免异常,请使用long idCategory=id作为long,并检查idCategory==null

我认为应该使用:currvalsequencename。你能试试吗?