【问题标题】:Access-DB(.accdb) access crash app when using OleDbConnection.Open()使用 OleDbConnection.Open() 时 Access-DB(.accdb) 访问崩溃应用程序
【发布时间】:2021-12-18 18:33:57
【问题描述】:

我最近尝试在一个小的 Revit 插件中使用带有 C# 代码的 access 数据库,但是当我使用 OleDbConnection.Open() 时它崩溃了

这是我的 sn-ps:

    CPFMainModelView mainModelView;
    static readonly string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\ThomasLECUPPRE(Letit\source\LIB_MainDB.accdb";

    public UserDBManager(CPFMainModelView cmmw)
    {
        mainModelView = cmmw;
        try
        {
            RetrieveprojectList();
        }
        catch (Exception ex)
        {
            mainModelView.Texte = $"{ex.Message}\n\n{ex.StackTrace}\n\n{ex.InnerException}\n\n{ex.Data}";
        }

    }

    public void RetrieveprojectList()
    {
        using (OleDbConnection con = new OleDbConnection(connectionString))
        {
            con.Open();
            OleDbCommand command = new OleDbCommand("SELECT Ref FROM FolderCategory", con);
            OleDbDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                mainModelView.Texte += $"\n{reader["Ref"]}";
            }
        }
    }

Here is 我的微型数据库在访问中的视图

我错过了什么?

我已经看到了这些帖子: C# - OleDbConnection.Open() causing a crash Simple C# connection to .accdb file

在使用“Provider=Microsoft.ACE.OLEDB.12.0”并仅为 X86 构建解决方案之前,我使用“Provider=Microsoft.Jet.OLEDB.4.0”并为除 this thread 之外的任何 CPU 构建解决方案(在法语对不起)用另一种方式告诉它。

感谢您的帮助。

【问题讨论】:

  • 您在哪里遇到了哪些异常?
  • 应用程序只是崩溃,没有例外,什么都没有,这就是问题所在:/ 使用“Provider=Microsoft.Jet.OLEDB.4.0”并为任何 CPU 构建解决方案我只是得到“Provider“blablabla”是未在本地计算机上注册”(引自“Lefournisseur 'Provider=Microsoft.Jet.OLEDB.4.0' n'est pas inscrit sur l'ordinateur local”。)
  • @KlausGütter 我刚刚用“Provider= ....12.0”尝试过,我得到了与 Provider=....4.0 相同的异常为什么我的插件没有显示这个异常并显示它对于 4.0 提供商?!
  • 查看 Windows 事件日志。应用程序崩溃通常会在那里留下一些有用的信息

标签: c# revit-api


【解决方案1】:

安装缺少的依赖

SO post

在现代 Windows 上,此驱动程序默认不再可用,但您可以在 MS 网站上以 Microsoft Access Database Engine 2010 Redistributable 的身份下载。如果您的应用是 32 位的,请务必下载并安装 32 位版本,因为据我所知 32 位和 64 位版本不能共存。

根据您的应用程序如何定位其数据库驱动程序,这可能就是所有需要的。但是,如果您使用 UDL 文件,则需要一个额外的步骤 - 您需要编辑该文件。不幸的是,在 64 位机器上,用于编辑 UDL 文件的向导默认是 64 位的,它不会看到 JET 驱动程序,只会拍打它首先在 UDL 文件中找到的任何驱动程序。有两种方法可以解决这个问题:

  1. 像这样启动 32 位 UDL 向导:C:\Windows\syswow64\rundll32.exe "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll",OpenDSLFile C:\path\to\your.udl。请注意,我可以在 Win7 64 Pro 上使用此技术,但它在 Server 2008R2 上不起作用(可能是我的错误,只是提一下)
  2. 在记事本或其他文本编辑器中打开 UDL 文件,它应该或多或少具有以下格式:

[oledb] ; Everything after this line is an OLE DB initstring Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Path\To\The\database.mdb;Persist Security Info=False

这应该可以让您的应用正确启动。

【讨论】:

  • 不适用于 "Provider=Microsoft.ACE.OLEDB.12.0" 但适用于 "Provider=Microsoft.Jet.OLEDB.4.0" 现在我得到一个无法识别的 System.Data.OleDb.OleDbException : 'Format de base de données ('C:\Users\ThomasLECUPPRE(Letit\source\LIB_MainDB.accdb') non reconnu.' 但这是另一个故事,谢谢你提供这些链接!
  • 我在 Acces 中使用了 List,这就是我得到这个异常的原因。我重组了我知道的数据库,没问题。
  • 我没有指定一件事,我在 wpf 应用程序中对此进行了测试,但是当我在 Revivt 插件中使用它时,我遇到了同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
相关资源
最近更新 更多