Преобразование массива байтов из 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 и т. д.) и работать оттуда.