2011-04-27 360 views
1

我正在嘗試使用基本ado.net過程計算數據庫表中某些int條目的平均值,但得到一個錯誤,指出該轉換無效。計算字段條目的平均值

try 
     { 
      int average; 

      string conn = @"Provider=Microsoft.Jet.OleDb.4.0; 
               Data Source=BookRateInitial.mdb"; 
      OleDbConnection connection = new OleDbConnection(conn); 



      OleDbCommand cmd = connection.CreateCommand(); 

      cmd.CommandText = @"SELECT AVG(rating) FROM bookRated WHERE title = 'the informers'"; 

      connection.Open(); 
      average = (int)cmd.ExecuteScalar(); 

      Console.WriteLine("The average is thus {0}", average); 
      connection.Close(); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 

這是計算數據庫中一組條目平均值的正確方法嗎?

親切的問候

+0

您得到了什麼類型的異常。當您直接在數據庫上運行查詢時會發生什麼?你也有連接泄漏。把連接關閉在最後或使用「使用」(http://stackoverflow.com/questions/4085466/what-is-using-connection-in-the-code)。我還建議使用存儲過程,而不是將代碼放在代碼 – Ivo 2011-04-27 13:16:52

+0

中。錯誤可能是因爲您的平均值有小數位,所以它無法轉換爲int。您需要將其舍入到無小數位,或截斷它。 – David 2011-04-27 13:18:10

回答

0

嘗試

object result = cmd.ExecuteScalar(); 
if (! (result is DBNull)) 
{ 
    average = Convert.ToInt32(result); 
} 

BTW,不應該平均值來浮點/雙精度?

0

可以更換

average = (int)cmd.ExecuteScalar(); 

有:

Reader = cmd.ExecuteReader(); 
while (Reader.Read()) 
{ 
    average = Reader.GetInt32(0); 
} 
0

試投/轉換爲十進制。 ;)

像這樣

try { return Convert.ToDecimal(cmd.ExecuteScalar()); } 
catch (Exception) { throw; } 
+1

一個普通的catch子句是非常糟糕的做法。至少捕獲一個特定的異常(InvalidCastException)。 – jeroenh 2011-04-27 13:22:15

0

錯誤消息說有什麼錯。結果是DBNull或它不是Int32。如果您確信結果類型是Int32,請使用以下代碼:

var result = cmd.ExecuteScalar(); 
average = result != DBNull.Value ? (int) result : 0;