在 C#-MS-Access-Interop 中从 acQuery 获取数据

Getting Data from acQuery in C#-MS-Access-Interop

假设我们有一个打开的数据库,它在完成 acQueries 之前 运行 正在执行几个进程,acQueries 将结果打印到 Access-Window。我发现我可以通过以下方式访问所有打开的查询:

AccessObject singleQuery in currApplication.CurrentData.AllQueries

由于该项目进行了不止一个查询,而且并不是所有的查询都给出了结果,我正在尝试并抓住 CurrentView-属性,它在访问时抛出异常并且查询未完成并且打开。

我现在知道搜索的是 singleQuery 中的哪个 AccessObject,但现在我一直在获取在 Access 屏幕上打印出的数据。 (可能是该对象不包含任何有关实际数据的信息,但这太可怕了^^)

有使用OleDb-Database reader的解决方案(类似于:Run Access Queries via Interop?),至少我认为它可以适用于这种情况,希望你能通过通缉,打开查询,但可以通过另一种方式从打开查询中检索数据,当我可以确保它 运行 并且有效时?

另一个选项是 DoCmd 将结果输出到文件并再次从中读取,但这似乎也不干净:https://msdn.microsoft.com/en-us/library/office/ff192065.aspx

好的,我们到了:

先提一下,我不知道 cdb.OpenRecordset(x.Name) 是否重新执行查询,如果这是不需要的行为,您必须先检查它。在这里它没有什么区别,这对我有用:

       foreach (dynamic x in currApplication.CurrentData.AllQueries)
        {
            try
            {
                var temp = x.CurrentView;
                Access.AccessObject temp2 = x;
                Microsoft.Office.Interop.Access.Dao.Database cdb = currApplication.CurrentDb();
                Microsoft.Office.Interop.Access.Dao.Recordset rst = cdb.OpenRecordset(x.Name);
                rst.MoveFirst();
                do
                {
                    foreach (Microsoft.Office.Interop.Access.Dao.Field field in rst.Fields)
                    {
                        Console.WriteLine(field.Name);
                        Console.WriteLine(field.Value);
                    }
                    rst.MoveNext();
                } while (rst.EOF != true);
                /*object[,] z = rst.GetRows();
                for (int i = 0; i <= z.GetUpperBound(0); i++)
                {
                    Console.WriteLine(z[i, 0].ToString());
                }*/
                Console.ReadLine();
            }
            catch (Exception ex)
            {

            }
        }

这会将所有打开的查询的所有数据 + 字段名打印到控制台输出。 Try-catch 是获取查询当前是否打开所必需的,这是我的问题中的条件,也许您的问题不需要。

很高兴没有我想象的那么复杂。