3

无法使用 .Net 客户端访问嵌入式 Firebird 数据库服务器

我的目标是开发一个使用嵌入式 Firebird 服务器但在尝试使用 .Net 客户端建立连接时遇到错误的程序。我已按照多个线程的建议使其工作,但我无法弄清楚。我尝试更改连接字符串和文件,但不断收到相同的错误。

以下是对我的研究以及迄今为止我所尝试的一切的详细解释:

  1. 如何使用 Visual C# 2010 连接和使用 Firebird db 嵌入式服务器

    我下载了链接中指定的文件,按照步骤运行了代码,得到了与原始海报相同的错误消息:

    FirebirdSql.Data.FirebirdClient.FbException Message=无法完成对主机“127.0.0.1”的网络请求。

    使用“localhost”代替 IP 会产生相同的错误。

    公认的答案是确保将所有 .dll 和配置文件复制到我已经完成的项目文件(包含代码的目录)和输出目录(bin/debug)中。我复制了 zip 文件夹中的每个文件。另外@Robin Van Persi 声明不使用“compact .Net data provider”,我怎么知道我是否在使用它?我从问题中的链接下载了文件。

    @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。三种方法都试过了,没变。事实上http://www.firebirdsql.org/en/firebird-net-provider-faq/说 fbembded.dll 但这也不起作用。

  2. 使用firebird嵌入式数据库时如何解决c#中的连接错误?

    对将 fbembed.dll 重命名为 fbclient.dll 有相同的建议,这对原始海报也不起作用。连接字符串中接受的答案 ServerType=1,但@cincura.net 答案下的评论给了我一个新的调查可能性;处理器架构。不幸的是,在 64bt 和 32bit 版本之间切换没有任何区别。

    我认为切换到 32 位版本可能是答案,因为我使用的是 Visual Studios Express。

  3. 使用嵌入式 Firebird 时出错

    该线程中的最后一条评论是另一个人说更改为 32 位也没有解决问题。

  4. 尝试使用 firebird 嵌入式服务器 - 指定的服务器类型不正确

    我回去查找有关 ServerType 的信息,因为我将其视为 1 和 0 并找到了这篇文章。@Nigel 的答案是更新到 .Net 提供程序的最新版本。不幸的是,我无法弄清楚如何在 Firebird 网站 (4.5.1.0) 上使用最新版本,因为它缺少示例中的 FirebirdSql 命名空间。此外,Visual Studios 会在我导入错误版本的 .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 回答
0

对我有用的唯一方法:在连接字符串中设置客户端路径。

<add name="MyEmbeddedDb" connectionString="user=SYSDBA;Password=masterkey;Database=|DataDirectory|MyDb.fdb;DataSource=localhost;Port=3050;Dialect=3;Charset=NONE;ServerType=1;client library=C:\firebird\fbembed.dll" providerName="FirebirdSql.Data.FirebirdClient" />

C:\Firebird 是一个文件夹,我提取了整个下载的 zip 文件 (Firebird-2.5.4.26856-0_Win32_embed.zip)

于 2015-06-23T20:03:21.593 回答