2016-05-12 44 views
1

我正在创建一个MS Access作为数据库后端的C#项目。我想显示两个日期之间的价格总和。我已创建以下查询方法:两个日期之间的总收入不工作c#ms访问数据库

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; 
} 

在窗体端我有两个时间选择器和一个按钮:

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); 
} 

但在MessageBox是显示一个空字符串:

+0

由于一直在答案中指出,Access查询中的日期文字需要用'#'字符包装,并且应该在'MDY'而不是'DMY'中。但是,请考虑使用[参数](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#应该成为。

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

尝试查询更改为:

_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") + "'"; 
-1

您可以使用日期时间参数梅索德selectDates这样的:

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; 
} 

和呼叫方法的DateTimePicker的wiyhout套价值串状这个:

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; 
} 
+0

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

+0

这可能是一种更简单的定义查询方法的方法,但作为这个问题的答案,它只能重复之前所说的内容 - 访问日期文字需要用'#'包装。 –

+0

@BeldiAnouar这是什么............? –

相关问题