преобразовать памятное поле в базе данных Access из двухбайтового в Unicode - PullRequest
0 голосов
/ 03 октября 2011

Я использую базу данных Access для одной системы и сервер SQL для другой системы. Данные синхронизируются между этими двумя системами. Проблема заключается в том, что одно из полей таблицы в базе данных Access - это поле Memo , которое имеет формат двухбайтовый . Когда я читаю эти данные, используя DataGridView в форме Windows, текст отображается как ???. Кроме того, когда данные из этого поля вставляются в поле nvarchar (max) базы данных сервера sql, неанглийские символы вставляются как ???.

Как получить данные из мемо-поля, преобразовать их кодировку в Unicode, чтобы они правильно отображались и в базе данных SQL-сервера?

Пожалуйста, помогите !!!

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Я решил эту проблему, преобразовав кодировку следующим образом:

        //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;

Спасибо всем за участие!

0 голосов
/ 04 октября 2011

У меня нет непосредственного опыта работы с элементами управления сеткой данных, но я уже заметил, что некоторые значения базы данных неправильно отображаются через элементы управления MS-Access. Например, для уникальных идентификаторов установлено значение «?????» значения при отображении в форме. Вы можете попробовать это в окне отладки, где элемент управления «myIdField» связан с полем «myIdField» из базового набора записей (уникальное поле типа идентификатора):

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

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

Вот что говорит справка Access по этому вопросу:

Ядро базы данных Microsoft Jet хранит GUID как массивы типа Byte. Однако Microsoft Access не может вернуть байтовые данные из элемента управления в форме или отчете. Для того, чтобы вернуть значение GUID из элемента управления, вы должны преобразовать его в строку. Чтобы преобразовать GUID для строки, используйте функцию StringFromGUID. Чтобы преобразовать строку вернуться к GUID, используйте функцию GUIDFromString.

Так что, если вы извлекаете значения из элементов управления для обновления таблицы (напрямую или через набор записей), вы можете столкнуться с похожими источниками ...

Одним из решений будет обновление данных непосредственно из исходного значения набора записей. Другой вариант - открыть исходный набор записей с помощью запроса, содержащего необходимые инструкции преобразования, чтобы поле было правильно отображено через элемент управления. Что я обычно делаю в аналогичной ситуации, когда мне приходится манипулировать полями uniqueIdentifier из нескольких источников данных (например, MS-Access и SQL Server), так это «стандартизировать» эти поля как текст в наборах записей. Наборы записей затем создаются с такими запросами, как:

  • SQL Server

    "SELECT convert (nvarchar (36), myIdField) как myIdField, .... FROM ...."

  • MS-Access

    "ВЫБЕРИТЕ stringFromGUID (myIdField) как myIdField, .... FROM ...."

...