【问题标题】:Show results in Datagridview based on DateTimePicker Value根据 DateTimePicker 值在 Datagridview 中显示结果
【发布时间】:2018-10-29 19:52:51
【问题描述】:

我试图让这个 datagridview 只显示用户通过 datetimepicker 选择的日期记录

这是我没有 datetimepicker 的原始代码

    private void frmSaleReport_Load(object sender, EventArgs e)
{
    OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;User Id=;Password=;Data Source=TS-POS.accdb");
    conn.Open();
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT InvoiceNo, DayDate, Gross, Net, Staff FROM GrossSales ORDER BY DayDate;", conn);
    DataSet ds = new DataSet();
    dataAdapter.Fill(ds);
    dataGridView2.DataSource = ds.Tables[0];
    dataGridView2.Columns["InvoiceNo"].HeaderText = "رقم الفاتورة";
    dataGridView2.Columns["InvoiceNo"].Width = 150;
    dataGridView2.Columns["DayDate"].HeaderText = " التاريخ";
    dataGridView2.Columns["DayDate"].Width = 350;
    dataGridView2.Columns["Gross"].HeaderText = "الإجمالي";
    dataGridView2.Columns["Gross"].Width = 150;
    dataGridView2.Columns["Net"].HeaderText = " الصافي";
    dataGridView2.Columns["Net"].Width = 150;
    dataGridView2.Columns["Staff"].HeaderText = " الموظف";
    dataGridView2.Columns["Staff"].Width = 150;
    conn.Close();
    GrandTotal();
    Qty();
}
private void Qty()
{
    int sum = 0;
    for (int i = 0; i < dataGridView2.Rows.Count; ++i)
    {
        sum += Convert.ToInt32(dataGridView2.Rows[i].Cells[0].Value);
    }
    textBox1.Text = sum.ToString();
}
private void GrandTotal()
{
    int sum2 = 0;
    for (int i = 0; i < dataGridView2.Rows.Count; ++i)
    {
        sum2 += Convert.ToInt32(dataGridView2.Rows[i].Cells[4].Value);
    }
    textBox3.Text = sum2.ToString();
}

现在如果我尝试添加 where 语句,它会在调试模式下开始给我关于数据类型不匹配的错误,我怎样才能让它工作?

这是我用于 datetimepicker 的链接

    OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT InvoiceNo, DayDate, Gross, Net, Staff FROM GrossSales Where DayDate = '"dateFrom.Value"'ORDER BY DayDate;", conn);

【问题讨论】:

  • 您需要使用“+”号将 sql 字符串与日期时间值相连接。或者使用字符串插值。
  • 看看你在做什么,你可能想考虑在你的数据的默认视图上设置一个行过滤器。这将防止您在每次有人更改日期时访问数据库。编辑:此外,一旦你解决了 Luis 表达的问题,Access 中的日期将被包裹在 # not '
  • 你好@Luis & Charles。我试过了,没有得到错误,但也没有得到任何价值

标签: c# ms-access datagridview calculated-columns


【解决方案1】:

连接日期值表达式时需要正确的格式:

OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT InvoiceNo, DayDate, Gross, Net, Staff FROM GrossSales Where DayDate = #" + dateFrom.Value.ToString("yyyy'/'MM'/'dd") + "#;", conn);

编辑:删除时间部分:

OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT InvoiceNo, DayDate, Gross, Net, Staff FROM GrossSales Where Fix(DayDate) = #" + dateFrom.Value.ToString("yyyy'/'MM'/'dd") + "#;", conn);

或:

OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT InvoiceNo, DayDate, Gross, Net, Staff FROM GrossSales Where DayDate >= #" + dateFrom.Value.ToString("yyyy'/'MM'/'dd") + "# And DayDate < #" + dateFrom.Value.AddDays(1).ToString("yyyy'/'MM'/'dd") + "#;", conn);

【讨论】:

  • 感谢 Gustav,我已经尝试过了,但它给了我这个错误 Syntax error in date in query expression 'DayDate = #05/DD/YYYY'。
  • 好吧,是我的错,我把MM放在小盒子里了,但是现在还是没有报错但是没有返回任何记录
  • 那么您的DayDate 可能包含时间部分。
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2019-07-16
相关资源
最近更新 更多