无法使用.Net客户端访问嵌入式Firebird数据库服务器
我的目标是开发一个使用嵌入式Firebird服务器的程序,但在尝试使用.Net客户端建立连接时会遇到错误。我已经按照多个线程的建议来使其工作,但我无法弄明白。我已经尝试更改连接字符串和文件但仍然遇到相同的错误。
以下是我的研究的详细解释以及迄今为止我尝试过的所有内容:
How to connect and use Firebird db embedded server with Visual C# 2010
我下载链接中指定的文件,按照步骤运行代码并获得与原始海报相同的错误消息:
FirebirdSql.Data.FirebirdClient.FbException 消息=无法完成主机“127.0.0.1”的网络请求。
使用“localhost”代替IP会产生相同的错误。
接受的答案是确保将所有.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消息=指定的服务器类型不正确。
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,但这也不起作用。
How to solve connection error in c# while using firebird embeded database?
对将fbembed.dll重命名为fbclient.dll也有同样的建议,这对于原始海报也不起作用。 连接字符串中接受的答案ServerType = 1,但@ cincura.net下的评论给了我一个新的调查可能性;处理器架构。不幸的是,在64bt和32bit版本之间切换没有任何区别。
我认为自从我使用Visual Studios Express以来,切换到32位版本可能就是答案。
Error in using Embeded Firebird
这个帖子的最后一个评论是另一个人说改为32位也没有解决问题。
Trying to use the firebird embedded server - Specified server type is not correct
我回去查找有关ServerType的信息,因为我已将其视为1和0并找到了这篇文章。 @Nigel的回答是更新到.Net提供商的最新版本。不幸的是,我无法弄清楚如何在Firebird网站(4.5.1.0)上使用最新版本,因为它缺少示例中的FirebirdSql命名空间。另外,当我导入时,Visual Studios会给我一些关于.Net的错误版本的警告。
我做错了什么?我是否需要使用不同的连接字符串或新版本的Firebird / .Net提供程序?我错过了别的什么吗?
我意识到这个问题可能被视为重复,但到目前为止我找到的答案都没有解决我的问题。另外,我之前引用的之前的StackOverflow Q / A已经存在多年了,所以我希望有人可以分享新的信息。
答案 0 :(得分:2)
我刚刚创建了一个非常基本的程序来测试从C#嵌入的Firebird。您需要添加最新的FirebirdSql.Data.FirebirdClient
nuget包(4.5.1.0),并将Firebird嵌入式zip工具包的整个内容放入与 .exe
请注意,您需要匹配应用程序的位数:
AnyCPU似乎相当棘手。当我将可执行文件编译为AnyCPU并在64位计算机上运行时,它与Firebird Embedded 64位组合时提供了BadImageFormatException
,但是使用了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不起作用。
答案 1 :(得分: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)