You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm按日期查询MS Access,DataGridView无结果且无报错

解决OleDbDataAdapter查询Access数据库无返回数据的问题

兄弟,我一眼就看出问题大概率出在日期字符串的拼接方式上!Access对日期查询的格式要求特别苛刻,你直接把日期转成MM/dd/yyyy拼进SQL里,但从你提供的数据库截图来看,日期存储格式是dd/MM/yyyy(比如01/08/2024应该是8月1日吧?),这就导致你查询的日期和数据库里的实际日期不匹配,所以查不到数据,而且还不会报错——这坑我以前也踩过!

给你两个解决方案,优先选第一个,绝对靠谱:

方案一:用参数化查询(推荐,安全又省心)

别再直接拼字符串了,参数化查询能让OleDb自动处理日期类型的转换,完全不用纠结格式问题,还能避免SQL注入风险。修改后的代码如下:

private void button1_Click_1(object sender, EventArgs e) 
{
    // 用using自动管理连接,不用手动关,防止资源泄漏
    using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;User Id=;Password=;Data Source=TS-POS.accdb"))
    {
        conn.Open();
        // 用?作为参数占位符,OleDb不支持严格的命名参数,顺序对应即可
        string sql = "SELECT InvoiceNo, DayDate, Gross, Net, Staff FROM GrossSales Where DayDate = ?";
        OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, conn);
        
        // 添加日期参数,指定类型为Date,确保转换正确
        dataAdapter.SelectCommand.Parameters.Add("@DayDate", OleDbType.Date).Value = dateFrom.Value.Date;
        
        DataSet ds = new DataSet();
        dataAdapter.Fill(ds);
        
        // 加个提示,用户体验更好
        if (ds.Tables[0].Rows.Count == 0)
        {
            MessageBox.Show("未找到指定日期的数据");
        }
        
        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;
    }
}

方案二:硬改日期格式(不推荐,容易踩坑)

如果你非要用字符串拼接,那就把日期转成和数据库一致的dd/MM/yyyy格式:

// 替换原来的日期拼接代码
dateFrom.Value.ToString("dd'/'MM'/'yyyy")

但这种方式很脆弱,比如系统区域设置变了就可能出问题,还是参数化查询靠谱。

另外补充个小细节:用dateFrom.Value.Date只取日期部分,就算数据库里的DayDate带时间,也能匹配到当天的所有数据,比直接用dateFrom.Value更稳妥。

内容的提问来源于stack exchange,提问作者Joey Arnanzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:14:37