2011-04-27 168 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;