使用C#插入Postgresql后抛出异常

时间:2013-02-15 13:55:45

标签: c# .net postgresql

使用此代码,我在对应于参数categoryName的表中搜索id。如果不存在,我在表中插入值,然后返回密钥。 何时执行long idCategory = (long) id;,有时它会起作用,有时会抛出无效的强制转换异常。 WHY ???

    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;
        }
    }

1 个答案:

答案 0 :(得分:0)

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

另外,请检查表'类别'中id的类型和列'idcategory'的数据类型。也许这些数据之间存在差异类型,导致异常。

也可能是'idcategory'未自动插入,因此您必须在 INSERT -statement中包含该内容。 ('SELECT LASTVAL()'是否返回 null ?)

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

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