2013-02-15 75 views
-1

使用此代码我搜索对应于参数categoryName的表中的id。如果不存在,我在表中插入值,然后返回密钥。 当执行long idCategory = (long) id;时,它有时会起作用,并且有时会抛出无效的转换异常。为什么???所有的Postgresql插入后蒙上C异常抛出异常#

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

我认为你应该使用:'CURRVAL(sequencename)'。你可以试试吗? – Steve 2013-02-15 14:05:47

回答

0

首先,请使用您的调试和检查id的值,它出现异常,这可能有助于发现问题。

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

这也可能是,那“idcategory”没有自动插入,所以你就必须做包括在INSERT语句来。 (是否'SELECT LASTVAL()'返回?)

除此之外,我总是喜欢long idCategory = Convert.ToInt64(id)超过long idCategory = (long)id

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

+0

感谢您的回答! – 2013-02-15 15:17:11