0

あるシステムにはAccessデータベースを使用し、別のシステムにはSQLサーバーを使用しています。データはこれら2つのシステム間で同期されます。問題は、Accessデータベースのテーブルのフィールドの1つが、 2バイト形式のメモフィールドであるということです。WindowsフォームでDataGridViewを使用してこのデータを読み取ると、テキストは???として表示されます。また、このフィールドのデータがSQL Serverデータベースのnvarchar(max)フィールドに挿入されると、英語以外の文字が???として挿入されます。

メモフィールドからデータをフェッチし、そのエンコーディングをUnicodeに変換して、SQLサーバーデータベースにも正しく表示されるようにするにはどうすればよいですか?

助けてください!!!

4

2 に答える 2

0

私はデータグリッドコントロールを直接経験したことはありませんが、一部のデータベース値がMS-Accessコントロールを介して正しく表示されないことにすでに気づきました。たとえば、Uniqueidentifiersは'?????'に設定されます フォームに表示されたときの値。これは、デバッグウィンドウで試すことができます。この場合、「myIdField」コントロールは、基になるレコードセット(一意の識別子タイプフィールド)の「myIdField」フィールドにバインドされます。

? screen.activeForm.recordset.fields("myIdField")
{F0E3C822-BEE9-474F-8A4D-445A33F363EE}

? screen.activeForm.controls("myIdField")
????

アクセスヘルプがこの問題について述べていることは次のとおりです。

Microsoft Jetデータベースエンジンは、GUIDをByte型の配列として格納します。ただし、Microsoft Accessは、フォームまたはレポートのコントロールからバイトデータを返すことはできません。コントロールからGUIDの値を返すには、それを文字列に変換する必要があります。GUIDを文字列に変換するには、StringFromGUID関数を使用します。文字列をGUIDに戻すには、GUIDFromString関数を使用します。

したがって、コントロールから値を抽出してテーブルを更新する場合(直接またはレコードセットを介して)、同様の発行者に直面する可能性があります...

1つの解決策は、レコードセットの元の値から直接データを更新することです。別のオプションは、フィールドがコントロールを介して正しく表示されるように、必要な変換命令を含むクエリで元のレコードセットを開くことです。複数のデータソース(MS-AccessやSQL Serverなど)のuniqueIdentifierフィールドを操作する必要がある同様の状況で通常行うことは、これらのフィールドをレコードセットのテキストとして「標準化」することです。次に、レコードセットは次のようなクエリで作成されます。

  • SQLサーバー

    "SELECT convert(nvarchar(36)、myIdField)as myIdField、.... FROM ...."

  • MS-Access

    "SELECT stringFromGUID(myIdField)as myIdField、.... FROM ...."

于 2011-10-04T07:31:12.827 に答える
0

次のようにエンコーディングを変換することで、この問題を解決しました。

        //Define Windows 1252, Big5 and Unicode encodings
        System.Text.Encoding enc1252 = System.Text.Encoding.GetEncoding(1252);
        System.Text.Encoding encBig5 = System.Text.Encoding.GetEncoding(950);
        System.Text.Encoding encUTF16 = System.Text.Encoding.Unicode;

        byte[] arrByte1 = enc1252.GetBytes(note);  //string to be converted
        byte[] arrByte2 = System.Text.Encoding.Convert(encBig5, encUTF16, arrByte1);
        string convertedText = encUTF16.GetString(arrByte2);
        return convertedText;

ピッチインしてくれてありがとう!

于 2011-10-12T01:36:22.793 に答える