C# 无法获取datatable中列的和

C# 无法获取datatable中列的和,c#,sql,datatable,C#,Sql,Datatable,我试图编写一个方法,从两个日期之间的条目中返回一列的总和。但是,无论发生什么情况,它都会不断返回一个DBnull。我还有其他类似的方法,可以在查询更简单时使用(无求和,simpleselect*where语句)performQuery()只是一个助手方法,它返回一个填充了查询结果的datatable public static int getBookedQuantity(int shopID, int bikeID, DateTime datetime) { st

我试图编写一个方法,从两个日期之间的条目中返回一列的总和。但是,无论发生什么情况,它都会不断返回一个
DBnull
。我还有其他类似的方法,可以在查询更简单时使用(无求和,simple
select*where语句
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;
    }
public静态int-getBookedQuantity(int-shopID,int-bikeID,DateTime-DateTime)
{
string query=“从预订中选择总和(数量)作为\“数量\”,其中bikeID=@bikeID和shopID=@shopID和starttime>=@Datetime和endtime<@Datetime”;
SqlParameter param1=新的SqlParameter(“@bikeID”,bikeID);
SqlParameter param2=新的SqlParameter(“@shopID”,shopID);
SqlParameter param3=新的SqlParameter(“@Datetime”,SqlDbType.Datetime);
param3.Value=日期时间;
DataTable bookingData=performQuery(查询,参数1,参数2,参数3);
DataRow[]行=bookingData.Select();
整数=0;
if((row.Count())>0&&(bookingData!=null))//如果有行返回
totalBooked=Convert.ToInt32(行[0][“数量]);
返回总记录;
}
提前谢谢你

尝试将查询修改为

string query = "SELECT sum(quantity) as 'quantity' FROM booking WHERE bikeID=@bikeID AND shopID = @shopID AND starttime >= @Datetime AND endtime < @Datetime";
string query=“从预订中选择总和(数量)作为“数量”,其中bikeID=@bikeID和shopID=@shopID和starttime>=@Datetime和endtime<@Datetime”;

数据表不是获取总和的正确方法。要解决问题,您必须执行以下操作:

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文档:


希望这能有所帮助。

FYI:在SQL中,
1+2+NULL
生成
NULL
如果我的查询使用SELECT*,然后我使用datatable.SELECT()方法来获取我的总和会怎么样?这可行吗?不,情况不同。在您的示例代码中,您必须只带总和,正确的方法是ExecuteScaler,因为它执行得非常好。无论如何,您可以使用databale,但是在您需要应用过滤器表达式之前,不需要调用“Select”方法(您看过有关此主题的MSDN文档吗?)