【问题标题】:Unable to get sum of column in datatable无法获取数据表中列的总和
【发布时间】:2017-02-08 08:01:41
【问题描述】:

我正在尝试编写一种方法,该方法返回两个日期之间条目的列总和。然而,无论如何它都会返回DBnull。当查询更简单时,我还有其他类似的方法(没有 SUM,简单的select * where statement)。 performQuery() 只是帮助方法,它返回一个填充的datatable 和查询结果。

    public static int getBookedQuantity(int shopID, int bikeID, DateTime datetime)
    {
        string query = "SELECT sum(quantity) as \"quantity\" FROM booking WHERE bikeID=@bikeID AND shopID = @shopID AND starttime >= @Datetime AND endtime < @Datetime";
        SqlParameter param1 = new SqlParameter("@bikeID", bikeID);
        SqlParameter param2 = new SqlParameter("@shopID", shopID);
        SqlParameter param3 = new SqlParameter("@Datetime", SqlDbType.DateTime);
        param3.Value = datetime;
        DataTable bookingData = performQuery(query, param1, param2, param3);
        DataRow[] row = bookingData.Select();
        int totalBooked = 0;
        if ((row.Count()) > 0 && (bookingData != null)) // if there are rows returned
            totalBooked = Convert.ToInt32(row[0]["quantity"]);
        return totalBooked;
    }

提前谢谢你!

【问题讨论】:

  • 仅供参考:在 SQL 中,1 + 2 + NULL 产生 NULL

标签: c# sql datatable


【解决方案1】:

尝试将查询修改为

string query = "SELECT sum(quantity) as 'quantity' FROM booking WHERE bikeID=@bikeID AND shopID = @shopID AND starttime >= @Datetime AND endtime < @Datetime";

【讨论】:

    【解决方案2】:

    DataTable 不是获取总和的正确方法。要解决您的问题,您必须这样做:

    var sum = Convert.ToInt32(bookingData.Rows[0]["quantity"]);
    return sum;
    

    但是,执行此命令的正确方法是:

    var statement = "SELECT COUNT(*) ...";
    var command = new SqlCommand(statement, connection);
    command.AddParam(param1);
    command.AddParam(param2);
    command.AddParam(param3);
    var sum = Convert.ToInt32(command.ExecuteScalar());
    return sum;
    

    有关标量的信息,请参阅 MSDN 文档:https://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx

    希望这能有所帮助。

    【讨论】:

    • 如果我的查询使用 SELECT *,然后我使用 datatable.select() 方法得到我的总和怎么办?这可行吗?
    • 不,情况不同。在您的示例代码中,您只需带上总和,正确的方法是 ExecuteScaler,因为它执行得非常好。无论如何,您可以使用数据包,但在需要应用过滤器表达式之前,不需要调用“Select”方法(您是否看过有关此主题的 MSDN 文档?)msdn.microsoft.com/en-US/library/det4aw50(v=vs.110).aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多