Конвертировать байтовый массив из Oracle RAW в System.Guid? - PullRequest
9 голосов
/ 19 апреля 2010

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

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

Ответы [ 3 ]

5 голосов
/ 23 апреля 2010

Оказывается, проблема была в порядке байтов, который вы получаете в Guid.ToByteArray(), а не в самом Oracle. Если вы возьмете Guid "11223344-5566-7788-9900-aabbccddeeff" и назовете ToByteArray(), вы получите "44332211665588779900AABBCCDDEEFF". Если вы затем передадите этот байтовый массив обратно в конструктор для Guid, вы получите оригинальный Guid. Моя ошибка была в том, что я пытался запросить базу данных Oracle по оригинальному формату Guid (с удаленными тире) вместо результата вызова ToByteArray().

Я до сих пор не знаю, почему байты упорядочены таким образом, но это, очевидно, не имеет ничего общего с Oracle.

4 голосов
/ 06 октября 2015

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

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

. NET конвертация собственного GUID

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

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

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

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

Steve

0 голосов
/ 19 апреля 2010

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

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

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

...