Мне нужно извлечь данные из некоторых старых файлов базы данных interbase, созданных с помощью InterBase 4.2.1. Я использую встроенную версию Firebird (версия 2.5.1) и .NetProvider (версия 2.7.0). Я никогда раньше не работал с межбазой Firebird (но у меня есть некоторый опыт работы с SQL SERVER и SQLite), и после двухдневного путешествия по сети и экспериментов я так и не нашел решения.
Таблицы в базе данных содержат данные на английском языке, а также данные на иврите. Каким бы оптимистичным я ни был, я начал с создания строки подключения с использованием UTF8:
FbConnectionStringBuilder builder = new FbConnectionStringBuilder();
builder.Database = m_DatabaseName;
builder.ServerType = FbServerType.Embedded;
builder.Charset = FbCharset.Utf8.ToString();
Но это дало мне следующее исключение:
bad parameters on attach or create database
CHARACTER SET Utf8 is not defined
Я правильно использовал fbintl.dll. (см. файлы в каталоге моего приложения и подкаталогах ниже). Я даже использовал ProcessMonitor, чтобы проверить, загружена ли fbintl.dll.
fbembed.dll
firebird.log
firebird.msg
FirebirdSql.Data.FirebirdClient.dll
ib_util.dll
icudt30.dll
icuin30.dll
icuuc30.dll
MyApplication.exe
Microsoft.VC80.CRT.manifest
msvcp80.dll
msvcr80.dll
intl\fbintl.conf
intl\fbintl.dll
udf\fbudf.dll
udf\ib_udf.dll
Итак, я попытался перечислить FbCharset
и попытаться подключиться к каждому набору символов, более половины из них выдавали одно и то же исключение, а когда я подключался к другим и запрашивал одно из полей иврита (используя IDataReader.GetString()
), я всегда получал один и тот же мусор. в результате. Кажется, не имеет значения, какой набор символов я указываю в строке подключения, результат всегда один и тот же, даже если я вообще не указываю какой-либо набор символов.
Затем я запросил наборы символов, определенные в базе данных SELECT RDB$CHARACTER_SET_NAME FROM RDB$CHARACTER_SETS
, и перечислил их, пытаясь соединиться с каждым из них, некоторые выдавали исключение, другие давали тот же результат, что и раньше.
Я понятия не имею, с каким набором символов была создана база данных, но я проверил наборы символов каждого поля в базе данных, и все текстовые поля имеют свои наборы символов, установленные на «НЕТ».
SELECT r.RDB$RELATION_NAME, r.RDB$FIELD_NAME, f.RDB$FIELD_NAME, cset.RDB$CHARACTER_SET_NAME
FROM RDB$RELATION_FIELDS r
LEFT JOIN RDB$FIELDS f ON r.RDB$FIELD_SOURCE = f.RDB$FIELD_NAME
LEFT JOIN RDB$CHARACTER_SETS cset ON f.RDB$CHARACTER_SET_ID = cset.RDB$CHARACTER_SET_ID
ORDER BY r.RDB$RELATION_NAME ASC, r.RDB$FIELD_POSITION ASC
Но я заметил, что в некоторых текстовых полях системных таблиц в качестве набора символов используется UNICODE_FSS. Я уже пробовал этот набор символов в строке подключения, но все еще получаю мусор для запрошенных текстовых полей.
Моя последняя попытка состояла в том, чтобы получить байты (используя IDataReader.GetBytes()
) и самостоятельно закодировать строку, но это дает мне исключение приведения (Unable to cast object of type 'System.String' to type 'System.Byte[]'.
)
У кого-нибудь есть идеи о том, как читать эти данные? Мне не нужно постоянно конвертировать базы данных, так как они больше не будут использоваться после извлечения данных.
РЕДАКТИРОВАТЬ: кстати, есть ли какие-нибудь бесплатные облегченные программы просмотра баз данных interbase/firebird, я не могу найти хороших (сопоставимых с SQLiteSpy) ?
Марк