2013-02-15 73 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