Revit插件调用OleDbConnection.Open()连接Access(accdb)时程序崩溃如何解决
Revit插件调用Access数据库Open时崩溃问题解决方案
问题复现
开发小型Revit插件时,通过C#调用Access数据库,执行OleDbConnection.Open()方法时程序直接崩溃,相关代码如下:
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"]}"; } } }
此前已尝试调整数据库驱动为Microsoft.Jet.OLEDB.4.0+Any CPU编译,出现驱动未注册报错,调整为Microsoft.ACE.OLEDB.12.0+X86编译后仍未解决。
问题排查与修复方案
- 修复连接字符串错误
现有连接字符串存在两处语法问题:一是数据源路径的用户名部分括号不闭合,ThomasLECUPPRE(Letit应为ThomasLECUPPRE(Letit);二是连接字符串缺少闭合配置项,修正后的连接字符串如下:static readonly string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\ThomasLECUPPRE(Letit)\source\LIB_MainDB.accdb;Persist Security Info=False;"; - 匹配编译平台与运行环境
Revit 2017及更高版本均为64位程序,X86编译生成的32位插件无法被64位Revit加载。请将解决方案平台调整为X64,同时安装对应64位版本的Microsoft Access Database Engine驱动,确保程序架构与驱动版本一致。 - 补充异常捕获与线程调度
当前仅在构造函数层捕获异常,若mainModelView.Texte的赋值操作在非UI线程执行,会触发Revit UI线程访问异常。建议将数据库查询逻辑与UI更新逻辑拆分,查询完成后通过Revit API的IExternalEventHandler接口调度到UI线程更新界面内容,避免跨线程操作崩溃。
内容的提问来源于stack exchange,提问作者Thomas_Lcp
相关产品推荐
相关产品推荐

