C# 如何从Firebird数据库获取错误代码

C# 如何从Firebird数据库获取错误代码,c#,firebird,firebird-embedded,C#,Firebird,Firebird Embedded,我们在MVC5项目中使用嵌入式Firebird V3.0.2 问题:当我们更新软件时,我们希望在创建新表之前先确定表是否存在。因此,我们只需对所需的表进行选择,如果出现sql错误代码为-204的异常,则该表不存在。但是如何解决错误代码-204 代码: 注意:我们希望防止在异常中解析消息文本。我们希望获得此错误的明确标志,例如,通过任何属性获取错误代码。您不应该查看所谓的SQLcode。SQLcodes是非常不具体的,例如SQLcode-204涵盖了范围广泛的错误,可能有几十个甚至数百个子错误。不

我们在MVC5项目中使用嵌入式Firebird V3.0.2

问题:当我们更新软件时,我们希望在创建新表之前先确定表是否存在。因此,我们只需对所需的表进行选择,如果出现sql错误代码为-204的异常,则该表不存在。但是如何解决错误代码-204

代码:


注意:我们希望防止在异常中解析消息文本。我们希望获得此错误的明确标志,例如,通过任何属性获取错误代码。

您不应该查看所谓的SQLcode。SQLcodes是非常不具体的,例如SQLcode-204涵盖了范围广泛的错误,可能有几十个甚至数百个子错误。不仅表未知,而且触发器未知、数据类型未知等

您需要查看错误代码FbException.ErrorCode,它与SQLcode不同,尽管这仍然很棘手,因为有时错误代码从非特定的嵌套到更具体的嵌套,覆盖了与相关SQLcode相似的范围。表unknown isc_dsql_relation_err或335544580就是这种情况,它嵌套在组isc_dsql_error 335544569中。isc_dsql_error-IIRC几乎一对一映射到SQLcode-204,这可能是几十到几百个错误


据我所知-但我通常不使用C语言编程-您需要查看FbException.Errors,它返回FbErrorCollection并检查它是否包含正确的错误。

您可以直接询问表是否存在-请参阅-但是可能存在第三种情况:表存在,但用户在表上没有选择授权。或者您可以尝试创建该表,如果create stmt失败,则该表已经存在。但是,对于软件升级来说,这都是错误的解决方案。因为表的选项比二进制存在/丢失的选项多。该表有许多可能的结构。随着您的软件不断发展,这些表、添加列、删除列、更改列类型等也将不断发展。您必须创建数据库格式的版本库和脚本库,每N个版本将数据库从版本N转换为版本N+1。并且您必须创建数据库格式历史记录表,其中,每N将有一个转换为格式N的日期。MAXN将是当前版本。@Arioch:你错了。此解决方案适用于全新的表。全新的表是一种临时快速状态。随着程序的发展,这将是越来越罕见的退化情况。但是,如果你想自己犯错误,而不是从别人的错误中吸取教训,那就祝你旅途愉快。FbException.Errors属性中有一个集合。包含此代码的项目。非常感谢您有意义的回答:
var lFbCommand = new FbCommand();
lFbCommand.Connection = "MyConnectionstring";
lFbCommand.Connection.Open();

// check if table exists by an select query
lFbCommand.CommandText = string.Format("SELECT FIRST 1 * FROM {0}", "MyTableName");

try
{
    pFbCommand.ExecuteNonQuery();
}
catch (FirebirdSql.Data.FirebirdClient.FbException e)
{
    if(e.? == -204) // -204 seem to be the errorcode for "Table does not exists."
    {
        // table does not exist.
    }
    else
    {
        throw;
    }
}