1

外部データベース(SQLite)を使用するAutoCAD用のプラグインを作成しています。まれに、「テーブルが見つかりません」というエラーが発生することがあります。それは私を夢中にさせます。私は答えのためのフォーラムをたくさん見ましたが、解決策を見つけることができませんでした。

ほとんどの場合、このエラーをスローするインスタンスはごくわずかです。

この問題を解決するにはどうすればよいですか。

DBへの相対パスを使用していますが、これはDebug/releaseフォルダー内にあります。

dbをアプリケーションに接続するための最良のアプローチは何ですか(私の場合、exeではなく.dllです)


返信ありがとうございます...申し訳ありませんが、メール通知が届きませんでした...

これがあなたが要求した情報です。

接続を処理する別のクラスがあります。これが私がDBに接続する方法です。

    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;

    }

これはAutoCADCivil3Dのプラグインであるため、起動時にロードするためにAppdata\autodeskフォルダにあります。テーブルが見つからないというエラーが発生することはめったにありませんが、アプリに関するすべてがうまく機能しています。アプリケーションの起動時に相対パスをすばやく解決できない可能性があります。

「Application.ExecutablePath;」を使用しようとすると、絶対パスを見つけるのが困難になります。そして私がオンラインで見つけた他のいくつかのもの..私が得るのはプラグインの場所ではなくAcad.exeの場所だけです。

  1. プラグインの場所の絶対パスを取得してDBの場所を取得するにはどうすればよいですか(DBと.dllは同じフォルダーにあるため)。
  2. 接続文字列で絶対パスと相対パスの両方を使用するにはどうすればよいですか(相対パスが失敗した場合、コードは絶対パスを使用してデータベースを見つけようとします)。

他の提案は素晴らしいでしょう。ありがとう


問題の原因を見つけました。アプリケーションを実行してアプリケーションを正しく閉じると(すべてのプロセスを完了した後)、正常に動作します。エラーメッセージは表示されません...

その間にアプリケーションのウィンドウを閉じた場合にのみエラーが発生します。アプリケーションを実行しようとすると、DBに対して開かれた接続がまだビジーであるように見えます。

4

2 に答える 2

1

Why not take an alternate route?

Instead of trying to find your DLL and associated SQLite database, I would recommend that you install them in a specific location. This way you can easily package it with an installer.

You can utilize automatic loading of .NET modules through AutoCAD with registry keys: http://through-the-interface.typepad.com/through_the_interface/2006/09/automatic_loadi.html

With this, you can simply install your AutoCAD plugins as if they were a normal program, and get AutoCAD to load them for you on launch.

于 2013-01-16T04:04:53.543 に答える
1

Get the path of the plugin with

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