2012-02-15 21 views
2

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に似ています)?

マーク

+1

http://gsbelarus.com/gs/fdbconvert/ FDBConvertユーティリティを使用して、データベースをFB 2.5形式に変換してください。 –

+0

ありがとう、私はそれを試した、それは私に "unkown server type"エラーを与えました。私はFBCloneユーティリティ(http://code.google.com/p/fbclone/、バージョン2.1.4)も試してみましたが、私のデータベースにRDB $ FIELDS.RDB $ FIELD_PRECISION。これらのデータベースを作成するために使用されたデータベースのバージョンは、これらのユーティリティでは古すぎると思います。 – Marc

+0

興味があれば私はIB 4.2をインストールしています。私はより良いアプローチは、FB 1.0バージョンまでのバックアップリストアシーケンスを介してデータベースをアップグレードし、FDBConvertユーティリティを使用して2.5に変換することだと思います。 –

答えて

3

解決策が見つかりました。

元のデータベースは、コードページ1255のウィンドウに書き込まれました。データを読み込むと、デフォルトのエンコード(これは1255ではありません)を使用してユニコード文字列が生成されます。だから私はちょうどデフォルトのエンコーディングを使用してバイトに文字列をデコードし、正しいエンコーディングを使用して文字列にバイトを変換します。

Encoding encoding = Encoding.GetEncoding(1255); 
... 
if (!datareader.IsDBNull(i)) 
{ 
    string value = dataReader.GetString(i); 
    if (value.Length > 0) 
    { 
     byte[] bytes = Encoding.Default.GetBytes(value); 
     value = encoding.GetString(bytes); 
    } 
    // store value 
} 

このソリューションは、私にとっては正常に動作しますが、私は例外bad parameters on attach or create database - CHARACTER SET WIN1255 is not definedを得ることなく、私たconnectionStringのcharsetとして「WIN1255」を指定することはできませんなぜ私はまだ理解していませんか? (私は文字セット "WINDOWS1255"を試してみましたが、例外はInvalid character set specifiedです)。

関連する問題