Как получить код ошибки из базы данных Firebird

Мы используем встроенный Firebird V3.0.2 для нашего проекта MVC5

Проблема: когда мы обновляем программное обеспечение, мы хотим выяснить, существует ли таблица, прежде чем мы создадим новую таблицу. Поэтому мы просто выбираем нужную таблицу, а в случае исключения с кодом ошибки 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;
    }
}

Примечание. Мы хотим предотвратить синтаксический анализ текста сообщения в исключении. Мы хотим получить четкий флаг для этой ошибки (например, код ошибки через любое свойство).

1 ответ

Решение

Вы не должны смотреть на (так называемый) SQL-код. Коды SQL очень неспецифичны, например, SQL-код-204 охватывает широкий спектр ошибок (может быть, десятки, если не сотни ошибок). Не только "таблица неизвестна", но также "триггер неизвестен", "тип данных неизвестен" и т. Д.

Вам нужно посмотреть на код ошибки (FbException.ErrorCode) (что не то же самое, что SQL-код), хотя это все еще сложно, потому что иногда коды ошибок вкладываются от неопределенного (охватывающего тот же диапазон, что и связанный SQL-код) к более конкретному. И это касается "таблицы неизвестных" (isc_dsql_relation_err или 335544580), который вложен в группу isc_dsql_error (335544569). isc_dsql_error - IIRC - отображает почти один-к-одному в SQLcode -204 (что может быть от нескольких десятков до нескольких сотен ошибок).

Насколько я знаю - но я обычно не программирую на C# - вам нужно будет взглянуть на FbException.Errors (который возвращает FbErrorCollection) и проверьте, содержит ли она правильные ошибки.

Другие вопросы по тегам