当使用 Firebird 3 数据库(服务器)但通过 .NET 库 FirebirdSql.Data.FirebirdClient 连接时(我尝试了 V. 7.10.1 和最新的 10.3.2),出现以下错误(在此示例中,我的 drop-constraint 语句有问题):
FirebirdSql.Data.FirebirdClient.FbException:元数据更新
ALTER TABLE mytable 失败,
未找到错误代码 336068738 的消息。
我尝试将firebird.msg
文件复制到system32
和文件夹。我还尝试使用此处所述的wow64
环境变量FIREBIRD_MSG=C:\Program Files\Firebird\Firebird_3_0\firebird.msg
它似乎对我通过错误的 SQL 语句生成的任何错误不起作用。
例如,我收到的另一个错误编号是 336068731。
代码如下:
if (DbProviderFactories.GetFactory("FirebirdSql.Data.FirebirdClient") is not FirebirdClientFactory fac)
{
throw new InvalidOperationException("FirebirdSql.Data.FirebirdClient.dll could not be loaded.");
}
var host = "localhost";
var user = "SYSDBA";
var pass = "masterkey";
var db = $"c:/databases/DelphiIn2025QuestionmarkQuestionmark.fdb";
var bld = new FbConnectionStringBuilder
{
Charset = "NONE",
DataSource = host,
Database = db,
UserID = user,
Password = pass,
WireCrypt = FbWireCrypt.Enabled
};
using (var con = fac.CreateConnection() as FbConnection)
{
if (con == null)
{
throw new InvalidOperationException("No FbConnection returned...");
}
con.ConnectionString = bld.ConnectionString;
con.Open();
using (var cmd = fac.CreateCommand() as FbCommand)
{
if (cmd == null) { throw new InvalidOperationException("No FbCommand returned..."); }
cmd.Connection = con;
cmd.CommandText = "alter table mytable drop constraint PK_uid";
cmd.ExecuteNonQuery();
}
}
FirebirdSql.Data.FirebirdClient 库不用于
firebird.msg
获取错误消息(也不使用fbclient.dll
,除非您在连接字符串中使用 Embedded 服务器类型),而是在中有自己的副本IscErrorMessages.cs
,并且当前版本没有您提到的错误代码。正如用户 13964273 在评论中提到的,错误代码是以下消息:
336068738
—约束@1不存在。336068731
—列:@1 未定义为 NOT NULL - 不能在 PRIMARY KEY 约束定义中使用奇怪的是,这两个错误信息都很老了,我本来以为它们应该已经存在了。因此,我不确定为什么它们还没有被包含进来,很可能是在填充该类时对错误信息进行了错误的过滤(或者使用了不完整的来源)。
我已经创建了问题#1221来修复这个问题。