【问题标题】:Access Query on C# Not Generating ResultsC# 上的访问查询不生成结果
【发布时间】:2018-05-22 09:09:08
【问题描述】:

我在 C# MVC 上使用以下 Access 查询来比较两个表并返回用户选择的日期范围和机器内的记录。查询代码在实际的 Access 数据库上完美运行,但我猜连接字符串和返回结果的代码有问题。我不确定代码有什么问题,如果有人可以帮助我确定问题所在,我将不胜感激。谢谢!

C# MVC 控制器代码:

    public ActionResult MissingChecksheets(string startDate, string endDate, string machine)
    {
        var query = $@"SELECT * FROM [TrackingLog]
                       WHERE [TrackingLog].[Workcenter] = '{machine}' AND 
                             [TrackingLog].[Complete Date] > #{startDate}# AND
                             [TrackingLog].[Complete Date] < #{endDate}# AND
                             [TrackingLog].[Order Item] NOT IN (SELECT [OrderNum] FROM [dbo_Checksheet])";

        var sheets = new List<Checksheet>();

        using (var con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Checksheets.accdb;"))
        {
            using (var command = new OleDbCommand(query, con))
            {
                con.Open();

                using (var reader = command.ExecuteReader())
                {
                    while (reader.NextResult())
                    {
                        sheets.Add(new FabChecksheet
                        {
                            OrderNum = reader.GetString(0),
                            PartNum = reader.GetString(1)
                        });
                    }
                }
            }

        }

        return PartialView(sheets);
    }

【问题讨论】:

  • 你有什么错误吗?
  • 你可以试试while (reader.Read())而不是.NextResult()。
  • 不,没有任何错误。但是当我运行代码时,OrderNum 和 PartNum 列是空的,并且没有生成任何结果。但是,当我将查询代码粘贴到 MSAccess 数据库查询上时,会生成记录。
  • @CharlesMay 成功了,查尔斯!非常感谢!
  • 来自access 的标签-“不要将此标签用于Microsoft Access,请改用ms-access

标签: c# html asp.net-mvc ms-access


【解决方案1】:

OleDbDataReader.NextResult() 方法用于在查询字符串有多个结果集时在结果集之间移动(例如,两个以上的 SELECT 语句,不包括聚合函数内的 SELECT)。由于您的查询只有一个结果集,因此必须使用 OleDbDataReader.Read() 在记录之间移动:

using (var con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Checksheets.accdb;"))
{
    using (var command = new OleDbCommand(query, con))
    {
        con.Open();

        using (var reader = command.ExecuteReader())
        {
            // Only single result set, use 'Read' here
            while (reader.Read())
            {
                sheets.Add(new FabChecksheet
                {
                    OrderNum = reader.GetString(0),
                    PartNum = reader.GetString(1)
                });
            }
        }
    }
}

请注意,如果使用NextResult(),数据读取器将移动到下一个具有空数据的结果集。

相关问题:

Difference between SqlDataReader.Read and SqlDataReader.NextResult

【讨论】:

    猜你喜欢
    • 2015-03-05
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多