【问题标题】:How can get the error code from an Firebird Database如何从 Firebird 数据库中获取错误代码
【发布时间】:2018-01-31 18:46:17
【问题描述】:

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

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

代码:

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;
    }
}

注意:我们要防止解析异常中的消息文本。我们想为这个错误获得一个明确的标志(例如,通过任何属性的错误代码)。

【问题讨论】:

  • 您可以直接询问表是否存在 - 请参阅 stackoverflow.com/a/45455737/976391 - 但是可能存在第三种情况:表存在但用户没有表上的 SELECT 授权。或者你可以尝试创建表,如果创建stmt失败,那么它已经存在了。
  • 然而这都是错误的软件升级解决方案。因为该表具有比二进制“存在/遗漏”更多的选项。表有许多可能的结构。随着您的软件不断发展,这些表也会不断发展,添加列,删除列,更改列类型等。您必须制作数据库格式的 VERSIONED 库和脚本库,将数据库从版本 N 转换为版本 N+1 N。您必须创建数据库格式历史表,其中您将有转换为格式 N 的每个 N 的日期。MAX(N) 将是当前版本。
  • @Arioch:你错了。此解决方案适用于全新的表格。
  • "totally new table" 是一种暂时转瞬即逝的状态。随着程序的发展,它将越来越少见,退化的情况。但是,如果您想犯自己的错误而不是从别人的错误中学习 - 祝您旅途愉快:-D 我和马克都为您提供了几种“创造错误”的方法

标签: c# firebird firebird-embedded


【解决方案1】:

您不应该查看(所谓的)SQLcode。 SQLcode 非常不具体,例如 SQLcode -204 涵盖了广泛的错误(如果不是数百个子错误,可能是几十个)。不仅仅是“table unknown”,还有“trigger unknown”、“Datatype unknown”等。

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

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

【讨论】:

  • 你是对的。 FbException.Errors 属性中有一个集合。一个项目包含此代码。非常感谢您的有意义的回答:)
猜你喜欢
  • 1970-01-01
  • 2013-05-01
  • 2022-10-18
  • 2011-04-02
  • 2013-10-16
  • 2013-10-17
  • 2018-07-28
  • 2018-11-16
  • 2020-09-18
相关资源
最近更新 更多