Преобразование массива байтов из Oracle RAW в System.Идентификатор GUID?

мое приложение взаимодействует с базами данных Oracle и SQL Server, используя пользовательский уровень доступа к данным, записанный в ADO.NET использование DataReaders. Прямо сейчас у меня проблема с преобразованием между GUID (которые мы используем для первичных ключей) и типом данных Oracle RAW. Вставки в oracle прекрасны (я просто использую метод ToByteArray () в системе.идентификатор GUID.) Проблема заключается в преобразовании обратно в систему.Guid при загрузке записей из базы данных. В настоящее время я использую массив байтов, из которого я получаю ADO.NET к переходим в конструктор для системы.идентификатор GUID. Кажется, что это работает, но GUID, которые появляются в базе данных, не соответствуют GUID, которые я генерирую таким образом.

Я не могу изменить схему базы данных или запрос (поскольку он повторно используется для SQL Server). Мне нужен код для преобразования массива байтов из Oracle в правильный Guid.

3 ответов


оказывается, проблема заключалась в порядке байтов, который вы получаете в Guid.ToByteArray() и не сам Oracle. Если вы возьмете Guid"


У меня была такая же проблема при хранении и чтении GUID из Oracle.

Если ваше приложение должно хранить и читать GUID из Oracle, используйте функцию FlipEndian из этого потока:

.NET собственное преобразование GUID

Byte[] rawBytesFromOracle;
Guid dotNetGuid = new Guid(rawBytesFromOracle).FlipEndian();

флип требуется только при чтении из Oracle.

при записи в Oracle используйте Guid.ToByteArray() как обычно.

Я потратил слишком много времени, пытаясь получить эту простую задачу завершенный.

Стив


У меня есть смутные воспоминания о том, что GUID из Oracle эффективно отменены по сравнению с порядком, который ожидает .NET.

попробуйте обратить массив перед вызовом Guid конструктор.

не может быть совсем как просто, как вспять, однако - вам может потребоваться сделать более подробную замену. Я предлагаю вам создать GUID, где каждый байт легко идентифицировать (использовать 0x01, 0x23, 0x45 и т. д.) и работать оттуда.