Как получить код ошибки из базы данных 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
) и проверьте, содержит ли она правильные ошибки.