2015-01-03 15 views
0

獲取查詢結果,這是我的函數:
從NpgsqlDataReader

public int gtCountCertificatByExercice() 
     { 
      DataTable resDataTable = new DataTable(); 
      DBConnection dbConnection = new DBConnection(); 
      string query = "SELECT COUNT(id) as nb_cert " + 
          "From crs_certificat " + 
          "WHERE id_exercice = " + IdExercice + " "; 
      NpgsqlConnection conn = dbConnection.Conn; 

      NpgsqlCommand cmd = conn.CreateCommand(); 
      cmd.CommandText = query; 
      Int32 nbCertByExercice = 0; 
      try 
      { 
       conn.Open(); 
       NpgsqlDataReader reader = cmd.ExecuteReader(); 

       while (reader.Read()) 
       { 
        nbCertByExercice = reader.GetInt32(0); 
       } 
       MessageBox.Show("" + nbCertByExercice); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.StackTrace); 
       MessageBox.Show(ex.Message); 
      } 
      conn.Close(); 
      return nbCertByExercice; 
     } 

,我總是得到這個錯誤:「指定的轉換無效」!
但是當我使用這個:

while (reader.Read()) 
       { 
        nbCertByExercice = Int32.Parse(reader["nb_cert"].ToString()); 
       } 

它工作正常!
和同樣的問題DateTime類型!
我應該怎麼做做得到領域的直接類型?

+0

什麼是'讀取器[ 「nb_cert」]的值。的ToString()'? –

+0

值爲「int」 –

+0

確定嗎?所以'COUNT(id)作爲nb_cert'返回'「int」'?如果您在數據庫上執行該查詢會怎麼樣? –

回答

1

你爲什麼不使用的ExecuteScalar您的查詢?

更換

NpgsqlDataReader reader = cmd.ExecuteReader(); 

while (reader.Read()) 
{ 
    nbCertByExercice = reader.GetInt32(0); 
} 

nbCertByExercice = (Int32) cmd.ExecuteScalar(); 

,當你有行來控制你應該使用閱讀器,executeScalar採取查詢,executenonquery的第一列的第一個值像插入操作,刪除

UPDATE

看着documentation你可以看到COUNT的返回類型是int而不是INt32。當您執行

reader.GetInt32(0); 

你InvalidCastException的,因爲它沒有做類型(refer here)的顯式轉換。

The exception that is thrown for invalid casting or explicit conversion.

否則當您執行Int32.Parse它總是嘗試轉換,如果失敗trows異常。

在你的情況下,值始終是有資格被轉換爲Int32但reader.GetInt32無法知道,因爲型動物類型;另一方面Int32.Parse作出了嘗試,它是成功的。

+0

有什麼區別? –

+0

對不起仍然是同樣的問題! –

+0

@SlimEN我已經更新了我的答案.. – faby