InterBase 4.2.1で作成された古いインターベースデータベースファイルからデータを抽出する必要があります。私はFirebirdの組み込みバージョン(バージョン2.5.1)と.NetProvider(バージョン2.7.0)を使用しています。以前はfirebirdのinterbaseで作業したことはありませんでした(しかし、私はSQL ServerとSQLiteに関するいくつかの経験があります)。そして、Webをクルージングして2日間試してみましたが、解決策はまだ見つかりませんでした。正しい文字コードを検出できません
データベース内のテーブルには、英語のデータだけでなく、ヘブライ語のデータも含まれています。
FbConnectionStringBuilder builder = new FbConnectionStringBuilder();
builder.Database = m_DatabaseName;
builder.ServerType = FbServerType.Embedded;
builder.Charset = FbCharset.Utf8.ToString();
しかし、それは私に次の例外与えた:私があったように楽観、私はUTF8を使用して、私の接続文字列を作成することによって開始した私が正しくfbintl.dllを使用
bad parameters on attach or create database
CHARACTER SET Utf8 is not defined
を。 (私のアプリケーションディレクトリと下のサブディレクトリにあるファイルを参照してください)。私は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
で定義されている文字セットを照会し、それらをそれぞれ列挙しようとしましたが、いくつかは例外をスローしました。他のものは以前と同じ結果を出しました。
私はデータベースが作成された文字セットについては手がかりがありませんでしたが、データベースの各フィールドの文字セットをチェックし、すべてのテキストフィールドの文字セットが 'NONE'に設定されています。
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があることに気付きました。私はすでにその文字列を接続文字列にしようとしましたが、依然として要求されたテキストフィールドの文字列を取得します。
私の最後の試み(Unable to cast object of type 'System.String' to type 'System.Byte[]'.
)(IDataReader.GetBytes()
を使用して)バイトを取得した文字列を自分自身をエンコードするためだったが、これは私のキャスト例外を与える
誰もがこのデータを読み取る方法上の任意のアイデアを持っていますか?私は一度データを抽出したら、もう使用されないので、データベースを永久に変換する必要はありません。
EDIT:btw、無料の軽量interbase/firebirdデータベースビューアはありますか?良いものは見つかりませんでした(SQLiteSpyに似ています)?
マーク
http://gsbelarus.com/gs/fdbconvert/ FDBConvertユーティリティを使用して、データベースをFB 2.5形式に変換してください。 –
ありがとう、私はそれを試した、それは私に "unkown server type"エラーを与えました。私はFBCloneユーティリティ(http://code.google.com/p/fbclone/、バージョン2.1.4)も試してみましたが、私のデータベースにRDB $ FIELDS.RDB $ FIELD_PRECISION。これらのデータベースを作成するために使用されたデータベースのバージョンは、これらのユーティリティでは古すぎると思います。 – Marc
興味があれば私はIB 4.2をインストールしています。私はより良いアプローチは、FB 1.0バージョンまでのバックアップリストアシーケンスを介してデータベースをアップグレードし、FDBConvertユーティリティを使用して2.5に変換することだと思います。 –