【问题标题】:Run Access Queries via Interop?通过互操作运行访问查询?
【发布时间】:2014-11-03 03:06:37
【问题描述】:

我在几个 *.mdb 文件中有几个 MS-Access 查询。它们非常复杂。
所以我只想打开一个文件,运行其中包含的特定查询并返回结果表。
我该怎么做?

(我知道我们可以通过连接字符串等进行连接,但我想通过这种方式进行探索。)


我的示例代码(经过编辑以禁用安全警报):
using Microsoft.Office.Interop.Access;
using Microsoft.Office.Core;

var app = new Application();
app.OpenCurrentDatabase(@"C:\test.mdb", true);
app.AutomationSecurity = MsoAutomationSecurity.msoAutomationSecurityLow;
app.Visible = false;
// run query
app.Quit();

示例查询:

select date(), date()-1

【问题讨论】:

    标签: c# ms-access com interop


    【解决方案1】:

    从 Microsoft Access 应用程序的实例中运行查询(例如,运行使用自定义 VBA 函数和其他功能的查询,这些功能可能不适用于来自直接 System.Data.OleDb 或 System.Data.Odbc 的查询连接)你可以这样做:

    var accApp = new Microsoft.Office.Interop.Access.Application();
    accApp.OpenCurrentDatabase(@"C:\Users\Public\Database1.accdb");
    Microsoft.Office.Interop.Access.Dao.Database cdb = accApp.CurrentDb();
    
    Microsoft.Office.Interop.Access.Dao.Recordset rst = 
            cdb.OpenRecordset(
                "SELECT FullName FROM ClientQuery", 
                Microsoft.Office.Interop.Access.Dao.RecordsetTypeEnum.dbOpenSnapshot);
    while (!rst.EOF)
    {
        Console.WriteLine(rst.Fields["FullName"].Value);
        rst.MoveNext();
    }
    rst.Close();
    accApp.CloseCurrentDatabase();
    accApp.Quit();
    

    【讨论】:

    • @Govert - 我不得不回滚您的编辑,因为它导致编译错误:“找不到类型或命名空间名称“Dao”(您是否缺少 using 指令或程序集参考?)”。我发现using Microsoft.Office.Interop.Access 有时会产生类似的奇怪结果。
    • 对不起 - 我应该检查一下。这是一个傲慢的时刻。
    • 你知道即使通过new DBEngine()打开数据库而不是完全访问new Application(),SQL查询中的VBA函数是否有效吗?
    • @Govert 不,他们不会。是Access.Application 对象提供了进入VBA 的钩子。直接 DAO 连接无法“看到”VBA 函数,就像直接 OLEDB 或 ODBC 连接一样。
    • 谢谢,成功了!你能给我一个提示如何在后台打开它(没有任何 gui)吗?弹出一个安全警告,阻止进程继续(需要手动输入)。
    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 2013-07-15
    • 2016-10-15
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多