3

.Net クライアントで組み込みの Firebird データベース サーバーにアクセスできない

Embedded Firebird サーバーを使用するプログラムの開発を目指していますが、.Net クライアントを使用して接続しようとするとエラーが発生します。複数のスレッドからのアドバイスに従って動作させましたが、わかりません。接続文字列とファイルを変更しようとしましたが、同じエラーが発生し続けます。

これが私の研究と私がこれまでに試したすべての詳細な説明です。

  1. Visual C# 2010 で Firebird db 組み込みサーバーに接続して使用する方法

    リンクで指定されたファイルをダウンロードし、手順に従ってコードを実行したところ、元のポスターと同じエラー メッセージが表示されました。

    FirebirdSql.Data.FirebirdClient.FbException Message=ホスト "127.0.0.1" へのネットワーク リクエストを完了できません。

    IP の代わりに「localhost」を使用すると、同じエラーが発生します。

    受け入れられた答えは、すべての .dll ファイルと構成ファイルがプロジェクト ファイル (コードのあるディレクトリ) と出力ディレクトリ (bin/debug) にコピーされていることを確認することです。zip フォルダー内のすべてのファイルをコピーしました。さらに、@Robin Van Persi は「コンパクトな .Net データ プロバイダー」を使用しないと述べていますが、これを使用しているかどうかはどうすればわかりますか? 質問のリンクからファイルをダウンロードしました。

    @PlageMan によって提供された別の回答は、ServerType=1; を追加することです。接続文字列に追加し、これらのエラーを生成する DataSource および Port 属性を削除します。

    FbConnection con = new FbConnection("User=SYSDBA;Password=masterkey;Database=TEST.FDB;Dialect=3;Charset=UTF8;ServerType=1;");
    

    System.NotSupportedException Message=指定されたサーバーの種類が正しくありません。

    FbConnection con = new FbConnection("User=SYSDBA;Password=masterkey;Database=TEST.FDB;Dialect=3;Charset=UTF8;");
    

    System.ArgumentException Message=無効な接続文字列引数が指定されたか、必要な接続文字列引数が指定されていません。

    @Toastgeraetによる最後の回答は、fbembed.dllの名前をfbclient.dllまたはgds32.dllに変更することを追加しています。3つの方法すべてを試しましたが、変化はありません。実際、 http://www.firebirdsql.org/en/firebird-net-provider-faq/には fbembded.dll と書かれていますが、それも機能しませんでした。

  2. firebird組み込みデータベースを使用しているときにc#で接続エラーを解決する方法は?

    元のポスターでも機能しなかった fbembed.dll の名前を fbclient.dll に変更することについて、同じアドバイスがあります。接続文字列で受け入れられた回答 ServerType=1 ですが、@cincura.net の回答の下のコメントにより、調査する新しい可能性が得られました。プロセッサ アーキテクチャ。残念ながら、64bt バージョンと 32 ビット バージョンを切り替えても違いはありませんでした。

    Visual Studios Express を使用しているので、32bit 版に切り替えることが解決策だったのではないかと思いました。

  3. 組み込み Firebird の使用エラー

    このスレッドの最後のコメントは、32 ビットに変更しても問題が解決しなかったと言っている別の人です。

  4. firebird 組み込みサーバーを使用しようとしています - 指定されたサーバーの種類が正しくありません

    ServerType を 1 と 0 として見て、この投稿を見つけたので、ServerType に関する情報を検索することに戻りました。@Nigelの答えは、.Netプロバイダーの最新バージョンに更新することです。残念ながら、Firebird Web サイトの最新バージョン (4.5.1.0) を使用する方法がわかりません。これは、サンプルから FirebirdSql 名前空間が欠落しているためです。さらに、Visual Studio では、.Net をインポートするときに、間違ったバージョンの .Net がターゲットになっているという警告が表示されます。

私は何を間違っていますか?別の接続文字列または新しいバージョンの Firebird/.Net プロバイダーを使用する必要がありますか? 他に何か不足していますか?

この質問は重複と見なされる可能性があることを認識していますが、これまでに見つけた回答のどれも私の問題を解決していません. さらに、私が上で引用した以前の StackOverflow Q/A はすべて何年も前のものなので、誰かが共有する新しい情報を持っていることを願っています.

4

2 に答える 2

4

C# から埋め込まれた Firebird をテストするための非常に基本的なプログラムを作成しました。最新のFirebirdSql.Data.FirebirdClientnuget パッケージ (4.5.1.0)を追加し、Firebird が埋め込まれた zip キットの内容全体を.exeと同じフォルダーにドロップする必要があります。

アプリケーションのビット数を一致させる必要があることに注意してください。

AnyCPU はかなりトリッキーなようです。実行可能ファイルを AnyCPU としてコンパイルし、64 ビット マシンで実行するBadImageFormatExceptionと、Firebird Embedded 64 ビットと組み合わせるとエラーが発生しましたが、Firebird Embedded 32 ビットでは動作しました。これは私が期待したものとは反対です。

class Program
{
    private const string DefaultDatabase = @"D:\data\db\employee.fdb";

    static void Main(string[] args)
    {
        string database = args.Length > 0 ? args[0] : DefaultDatabase;
        var test = new TestEmbedded(database);

        test.RunTestQuery();

        Console.ReadLine();
    }
}

class TestEmbedded
{
    private readonly string connectionString;

    public TestEmbedded(string database)
    {
        var connectionStringBuilder = new FbConnectionStringBuilder();
        connectionStringBuilder.Database = database;
        connectionStringBuilder.ServerType = FbServerType.Embedded;
        connectionStringBuilder.UserID = "sysdba";

        connectionString = connectionStringBuilder.ToString();

        Console.WriteLine(connectionString);
    }

    internal void RunTestQuery()
    {
        using (var connection = new FbConnection(connectionString))
        using (var command = new FbCommand("select 'success' from RDB$DATABASE", connection))
        {
            Console.WriteLine("Connecting...");
            if (connection.State == System.Data.ConnectionState.Closed) 
            { 
                connection.Open(); 
            }

            Console.WriteLine("Executing query");
            using (var reader = command.ExecuteReader())
            {
                if (reader.Read())
                {
                    Console.WriteLine(reader.GetString(0));
                }
            }
        }
    }
}

このプログラムによって生成される接続文字列は次のとおりです。

initial catalog=D:\data\db\employee.fdb;server type=Embedded;user id=sysdba

これは、接続に必要な最小限のようです。Windows に埋め込まれた Firebird は認証を実行しませんが、提供user idが必要であることに注意してください。そうしないと、信頼できる認証がトリガーされ、Firebird が埋め込まれたものでは機能しません。

于 2014-10-04T08:40:17.533 に答える