2017-02-08 5 views
-1

2つの日付間のエントリの列の合計を返しますメソッドを作成しようとしています。しかし、何があっても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 [email protected] 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; 
    } 

ありがとうございます!

+2

FYI: '1 + 2 + NULL'は' NULL'を返します –

答えて

0

string query = "SELECT sum(quantity) as 'quantity' FROM booking WHERE [email protected] AND shopID = @shopID AND starttime >= @Datetime AND endtime < @Datetime"; 
0

の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

これが助けてくれることを願っています。

+0

クエリでSELECT *を使用し、datatable.select()メソッドを使用して合計を取得するとどうなりますか?それは実行可能ですか? –

+0

いいえ、ケースが異なります。あなたのサンプルコードでは、それは非常にうまく動作するため、合計だけを持ってきて、正しい方法はExecuteScalerです。とにかくdatabaleを使うことができますが、フィルタ式を適用する必要があるまでは、 "Select"メソッドの呼び出しは必要ありません(このトピックについてはMSDNの文書を参照してください)。https://msdn.microsoft.com/en-US /library/det4aw50(v=vs.110).aspx –

関連する問題