問題を簡単に作成できる小さなサンプルに絞り込みました。
簡単な説明- データベース接続にfirebirdの埋め込みdllを使用しています。つまり、firebirdデータベースに接続するためにfbembed.dllを使用しています。コードでは、このような3つの接続文字列があります(3番目の接続文字列で指定された追加の属性クライアントライブラリに注意してください)-
private const string connection1 = @"User=SYSDBA;Password=masterkey;Database=D:\DB1.fdb;ServerType=1;Charset=UTF8";
private const string connection2 = @"User=SYSDBA;Password=masterkey;Database=D:\DB2.fdb;ServerType=1;Charset=UTF8";
private const string connection3 = @"User=SYSDBA;Password=masterkey;Database=D:\DB2.fdb;ServerType=1;client library=D:\fbembed.dll;Charset=UTF8";
UIに2つのボタンがあり、最初のボタンをクリックするとこのコードが表示されます-
FbConnection fbConnection = new FbConnection(connection1);
fbConnection.Open();
2番目のボタンをクリックすると、このコードが表示されます-
FbConnection fbConnection = new FbConnection(connection3);
fbConnection.Open();
connection3として指定された接続文字列で接続を作成すると、FbException 「オペレーティングシステムディレクティブCreateFilefailed」が発生します。
ただし、接続文字列をconnection2として置き換えると、正常に機能します。
さらに、connection3、次にconnection1で接続を作成しても問題はありませんが、connection1、次にconnection3で接続を作成すると、同じfbexceptionが発生します。
connection2とconnection3で指定されたデータベースは同じですが、違いは追加の属性クライアントライブラリのみであることに注意してください。
なぜこの奇妙な行動が火の鳥を埋め込んだのか。システムにfirebirdサーバーがインストールされている場合は、すべて正常に機能します。しかし、なぜそれがfirebirdの埋め込みdllに残るのかという問題を知りたいですか?