在 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 是获取查询当前是否打开所必需的,这是我的问题中的条件,也许您的问题不需要。
很高兴没有我想象的那么复杂。
假设我们有一个打开的数据库,它在完成 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 是获取查询当前是否打开所必需的,这是我的问题中的条件,也许您的问题不需要。
很高兴没有我想象的那么复杂。