1

我正在为使用外部数据库(SQLite)的 AutoCAD 创建一个插件。在极少数情况下,我会收到“找不到表”错误。这让我疯狂。我已经看到很多论坛的答案无法找到解决方案。

它在大多数情况下都有效,只有少数情况下会引发此错误。

我该如何解决这个问题。

我正在使用数据库的相对路径,它位于 Debug/release 文件夹中。

将数据库附加到应用程序的最佳方法是什么(在我的情况下它是 .dll 而不是 exe)


谢谢大家的回复...对不起,我没有收到任何电子邮件通知...

这是您要求的信息。

我有一个单独的类——它处理连接。这是我连接到数据库的方式。

    public static SQLiteConnection GetConnection()
    {
        string conn_string = string.Format("Data Source=./sdf_db1.s3db");
        SQLiteConnection conn = new SQLiteConnection(conn_string);

        if (!System.IO.File.Exists("./sdf_db1.s3db"))
        {
            Global.variables.mess_out_exception("Missing Database file", "Error");
        }

        return conn;

    }

由于这是 AutoCAD Civil3D 的插件,它位于 Appdata\autodesk 文件夹中以在启动时加载。该应用程序的所有内容都运行良好,除了我很少收到未找到表的错误。看起来可能是应用程序启动时相对路径无法快速解析。

如果我尝试使用“Application.ExecutablePath;”,我很难找到绝对路径 以及我在网上找到的其他一些东西。我得到的只是 Acad.exe 的位置,而不是插件的位置。

  1. 如何获取插件位置的绝对路径以获取 DB 的位置(因为 DB 和 .dll 位于同一文件夹中)。
  2. 如何在连接字符串中同时使用绝对路径和相对路径(因此,如果相对路径失败,代码可以尝试使用绝对路径定位数据库)。

任何其他建议都会很棒。谢谢


我找到了问题的原因,当我运行应用程序并正确关闭应用程序(意味着完成所有过程后)它工作正常我没有收到任何错误消息......

仅当我在两者之间关闭应用程序窗口时才会收到错误消息。如果我尝试运行应用程序,看起来为数据库打开的连接仍然很忙。

4

2 回答 2

1

获取插件的路径

var asmpath = Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location );
于 2013-01-16T03:40:16.403 回答
1

为什么不采取替代路线?

我建议您将它们安装在特定位置,而不是尝试查找您的 DLL 和关联的 SQLite 数据库。通过这种方式,您可以轻松地将其与安装程序打包在一起。

您可以使用注册表项通过 AutoCAD 自动加载 .NET 模块:http: //through-the-interface.typepad.com/through_the_interface/2006/09/automatic_loadi.html

有了这个,您可以像安装普通程序一样简单地安装 AutoCAD 插件,并让 AutoCAD 在启动时为您加载它们。

于 2013-01-16T04:04:53.543 回答