2016-05-12 10 views
1

データベースバックエンドとしてMS Accessを使用してC#プロジェクトを作成しています。私は2つの日付の間に価格の合計を表示したい。2つの日付間の総収益が動作しません。c#msアクセスデータベース

private void btnTotalRevenue_Click(object sender, EventArgs e) 
{ 
    dt = db.selectDates((pickerDateFrom.Text).ToString().Trim(), (pickerDateTo).ToString().Trim()); 
    string a = dt.Rows[0]["Price"].ToString(); 
    MessageBox.Show(a); 
} 

が、メッセージボックスが空の文字列表示されています:を私は2時間ピッカーとボタンがあり、フォーム側では

public DataTable selectDates(string dateFrom,string dateTo) 
{ 
    initilize(); 
    _conn.ConnectionString = _cs; 
    _cmd.Connection = _conn; 

    _cmd.CommandText = "Select Sum(tPrice) AS Price from [tblInventory] where Date_Of_Installation BETWEEN '" + dateFrom + "' AND '" + dateTo + "'"; 
    _da.SelectCommand = _cmd; 
    _da.Fill(_dt); 
    return _dt; 
} 

:私は、次のクエリメソッドを作成しています。

+0

されているように答えに書かれているように、Accessクエリの日付リテラルは '# '文字でラップする必要があり、' DMY'の代わりに 'MDY'になければなりません。ただし、[parameters](https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparameter%28v=vs.110%29.aspx)を使用することを検討してください。 SQLインジェクションを回避し、クエリプランの再利用を可能にするという一般的な利点は別として)。 –

答えて

3

MS Accessでは、日付を書式設定して#記号で囲む必要があります。

例。

SELECT Sum(tPrice) AS Price from [tblInventory] 
WHERE Date_Of_Installation BETWEEN #2016/01/01# AND #2016/02/01# 

だから、あなたのC#になるはずです。以下のような文字列へのDateTimePickerのwiyhoutケーシング値

public DataTable selectDates(DateTime dateFrom, DateTime dateTo) 
{ 
    initilize(); 
    _conn.ConnectionString = _cs; 
    _cmd.Connection = _conn; 
    string query = string.Format("Select Sum(tPrice) AS Price from [tblInventory] where Date_Of_Installation BETWEEN #{0}# AND #{1}#", dateFrom.ToString("yyyy/MM/dd"), dateTo.ToString("yyyy/MM/dd")); 
    _cmd.CommandText = query; 
    _da.SelectCommand = _cmd; 
    _da.Fill(_dt); 
    return _dt; 
} 

と呼び出し方法:あなたはこのようMethodeののselectDatesでのDateTimeパラメータを使用することができます

_cmd.CommandText = "Select Sum(tPrice) AS Price from [tblInventory] where 
Date_Of_Installation BETWEEN '" + dateFrom.ToString("yyyy-MM-dd") + "' AND '" + 
dateTo.ToString("yyyy-MM-dd") + "'"; 
+0

ありがとうございました –

0

てみにクエリを変更するにはこれは:

void btnTotalRevenue_Click(object sender, EventArgs e) 
{ 
    dt = db.selectDates(pickerDateFrom.Value, pickerDateTo.Value); 
    string a = dt.Rows[0]["Price"].ToString(); 
    MessageBox.Show(a); 
} 

しかし、私は(変換する必要はありません)DbType.DateTimeを使用して、パラメータに直接日時を渡すためにパラメータを使用することができアドバイス、また、SQLインジェクションを防ぐため、このような:

public DataTable selectDates(DateTime dateFrom, DateTime dateTo) 
{ 
    initilize(); 
    _conn.ConnectionString = _cs; 
    string query = "Select Sum(tPrice) AS Price from [tblInventory] where Date_Of_Installation BETWEEN @startDate AND @endDate"; 
    OleDbCommand _cmd = new OleDbCommand(query, _conn); 
    cmd.Parameters.AddWithValue("@startDate ", DbType.DateTime).Value = dateFrom; 
    cmd.Parameters.AddWithValue("@endDate ", DbType.DateTime).Value = dateTo; 
    _da.SelectCommand = _cmd; 
    _da.Fill(_dt); 
    return _dt; 
} 
-1

private void btnTotalRevenue_Click(object sender, EventArgs e) 
{ 
    dt = db.selectDates(pickerDateFrom.SelectedDate.Value.ToString("#yyyy/MM/dd#"), pickerDateTo.SelectedDate.Value.ToString("#yyyy/MM/dd#")); 
    string a = dt.Rows[0]["Price"].ToString(); 
    MessageBox.Show(a); 
} 
+0

..............? –

+0

これはクエリメソッドを定義するより簡単な方法かもしれませんが、この質問に対する答えとして、以前に言われたことを繰り返すだけです - アクセスリテラルを '# 'でラップする必要があります。 –

+0

@BeldiAnouarこれはなんですか? –

関連する問題