3

我有一个查询,我尝试获取总和值,但我得到了 InvalidCastException。

我的查询是:

SELECT e.clockNr,e.firstName,e.LastName,e.unionName,i.points 
FROM ( 
    SELECT employee.clockNr AS clockNr,
           employee.firstName AS firstName,
           employee.lastName AS lastName,
           Unions.name AS unionName 
           FROM employee,Unions 
           WHERE employee.active=1 AND employee.unionId = unions.id  
           GROUP BY employee.clockNr 
     ) e LEFT JOIN (
           SELECT infraction.clockNr AS clockNr, 
           CAST(SUM(Infraction.points) AS SIGNED) AS points 
           FROM infraction 
           WHERE infraction.infractionDate >=@startDate 
           AND infraction.infractionDate <=@endDate 
           GROUP BY infraction.clockNr 
     ) i ON e.clockNr = i.clockNr 
ORDER BY e.clockNr ASC

出错的地方是“点”列。我已将 CAST 添加到 SIGNED 中,但这无济于事。

我读出专栏的方式是:

int iGetPoints = Convert.ToInt32(reportReader["points"]);

也试过:

int iGetPoints = (int)reportReader["points"];

但两者都会引发 InvalidCastException。该查询在 PHPMyAdmin 中进行了测试,并且在那里运行良好。

谁能看到我做错了什么或给我提示在哪里寻找?

4

1 回答 1

2

因为该points列是左连接的一部分,所以它可以为空。我假设这就是这里的问题。您需要测试 null 以避免强制转换异常:

// Note: this is for DataTableReader; see below for MySQL data reader
int iGetPoints = 0;
if (!reportReader.IsDBNull(reportReader.DBOrdinal("points"))) {
   iGetPoints = Convert.ToInt32(reportReader["points"]);
}

IsDBNull方法需要列名的索引(它不适用于名称),因此调用DBOrdinal从名称中获取索引。


注意:上面的答案适用于“通用”System.Data.DataTableReader类,但不适用于 MySQL 数据阅读器。Gerard 在下面的评论中发布了 MySQL 阅读器所需的更改。他们是:

int iGetPoints = 0;
if (reportReader["points"] != DBNull.Value) {
   iGetPoints = Convert.ToInt32(reportReader["points"]);
}
于 2013-08-08T17:54:50.647 回答