Oracle의 RAW(16)에서 로 변환합니다.NET의 GUID
수동으로 디버깅하는 데 어려움이 있습니다.GUID 값이 와 다른NET 어플리케이션NET에서 Oracle로
- 여기서 C#은 다음과 같습니다.
17D89D326C2142D69B989F5201288DBF
- Oracle의 내용:
329DD817216CD6429B989F5201288DBF
C#의 GUID에서 수동으로 디버깅하는 방법, 즉 Oracle 쿼리에 해당 값을 붙여넣고 올바른 결과를 얻을 수 있는 방법(및 그 반대)은 무엇입니까?
(쌍으로 구성된) 16진수 값을 보면 마지막 7바이트는 두 경우 모두 동일하지만 처음 9바이트는 약간 전환되어 있음을 알 수 있습니다.
위의 예에서 벗어나 각 쌍을 다시 씁니다.NET은 00, 11, 22 등이며 Oracle의 관련 바이트를 전환합니다.
.NET:
00112233445566778899AABBCCDDEEFF
Oracle:
33221100554477668899AABBCCFFEEFF
따라서 관련 바이트를 전환하기 위한 코드를 쓰는 것은 매우 쉬울 것입니다.(사실 이전 직장에서 이 작업을 수행하기 위해 코드를 작성했다고 확신합니다.)
바이트를 전환하려면 전화만 하면 됩니다.Guid.ToByteArray()
그리고.new Guid(byte[])
되돌아가다Guid
.
EDIT: 실제로 위의 스위치 라운드는 정확하게Guid
컨스트럭터는 바이트 배열을 전달하면 다음과 같이 처리됩니다.
using System;
using System.Linq;
class Test
{
static void Main()
{
byte[] bytes = Enumerable.Range(0, 16)
.Select(x => x * 16 + x)
.Select(x => (byte) x)
.ToArray();
Console.WriteLine(BitConverter.ToString(bytes).Replace("-", ""));
Console.WriteLine(new Guid(bytes).ToString().Replace("-", ""));
}
}
인쇄:
00112233445566778899AABBCCDDEEFF
33221100554477668899aabbccddeeff
그러면 전환이 상당히 쉬워질 수 있습니다.처음에 어떻게 가치관을 파악하셨습니까?"Oracle에서 표시되는 방식"뿐입니까?
편집: 네, 여기 몇 가지 변환 기능이 있습니다.데이터를 텍스트로 취득하면 양방향으로 변환됩니다.
using System;
using System.Linq;
class Test
{
static void Main()
{
string oracle = "329DD817216CD6429B989F5201288DBF";
string dotNet = "17D89D326C2142D69B989F5201288DBF";
Console.WriteLine(oracle == DotNetToOracle(dotNet));
Console.WriteLine(dotNet == OracleToDotNet(oracle));
}
static string OracleToDotNet(string text)
{
byte[] bytes = ParseHex(text);
Guid guid = new Guid(bytes);
return guid.ToString("N").ToUpperInvariant();
}
static string DotNetToOracle(string text)
{
Guid guid = new Guid(text);
return BitConverter.ToString(guid.ToByteArray()).Replace("-", "");
}
static byte[] ParseHex(string text)
{
// Not the most efficient code in the world, but
// it works...
byte[] ret = new byte[text.Length / 2];
for (int i = 0; i < ret.Length; i++)
{
ret[i] = Convert.ToByte(text.Substring(i * 2, 2), 16);
}
return ret;
}
}
Oracle에서 Guids를 저장 및 읽을 때도 같은 문제가 있었습니다.
Jon의 답변은 질의에 적합하지만, 앱이 Oracle의 Guid를 저장하고 읽어야 하는 경우 이 스레드의 FlipEndian 함수를 사용하십시오.
Byte[] rawBytesFromOracle;
Guid dotNetGuid = new Guid(rawBytesFromOracle).FlipEndian();
플립은 Oracle에서 다시 읽을 때만 필요합니다.
Oracle에 쓸 때는 GUID를 사용합니다.ToByteArray()는 정상입니다.
나는 이 간단한 일을 완수하기 위해 너무 많은 시간을 소비했다.
스티브
PL/SQL에서 GUID를 RAW로 변환해야 하는 경우 다음 기능을 사용할 수 있습니다.
/*
CONVERT a GUID FORMAT in RAW(16)
EX:
guid = 88c6a267-65d2-48d6-8da2-6f45e2c22726
raw = 67A2C688D265D6488DA26F45E2C22726
*/
FUNCTION GuidToRaw( guid IN VARCHAR2 ) RETURN RAW
IS
ret RAW(16);
guidHex VARCHAR2(64);
BEGIN
guidHex := SUBSTR (guid, 7, 2);
guidHex := CONCAT( guidHex, SUBSTR (guid, 5, 2) );
guidHex := CONCAT( guidHex, SUBSTR (guid, 3, 2) );
guidHex := CONCAT( guidHex, SUBSTR (guid, 1, 2) );
guidHex := CONCAT( guidHex, SUBSTR (guid, 12, 2) );
guidHex := CONCAT( guidHex, SUBSTR (guid, 10, 2) );
guidHex := CONCAT( guidHex, SUBSTR (guid, 17, 2) );
guidHex := CONCAT( guidHex, SUBSTR (guid, 15, 2) );
guidHex := CONCAT( guidHex, SUBSTR (guid, 20, 2) );
guidHex := CONCAT( guidHex, SUBSTR (guid, 22, 2) );
guidHex := CONCAT( guidHex, SUBSTR (guid, 25, 12) );
ret := HEXTORAW( guidHex );
return ret;
end;
항상 표준만 사용GUID
.NET에서는...
삽입하고 싶은 경우GUID
Oracle에 접속할 때마침Guid.ToString ( "N")
이 문자열을 Oracle에 공급합니다(이 예에서는 파라미터명은MyNETVAL
):
INSERT INTO MyTable ( MyRAWCol)
SELECT HEXTORAW (SUBSTR (MyNETVal, 6, 2) || SUBSTR (MyNETVal, 4, 2) || SUBSTR (MyNETVal, 2, 2) || SUBSTR (MyNETVal, 0, 2) || SUBSTR (MyNETVal, 10, 2) || SUBSTR (MyNETVal, 8, 2) || SUBSTR (MyNETVal, 14, 2) || SUBSTR (MyNETVal, 12, 2) || SUBSTR (MyNETVal, 16, 16)) FROM DUAL;
a를 읽을 때RAW
사용하는 Oracle:
SELECT
SUBSTR (HexV, 6, 2) || SUBSTR (HexV, 4, 2) || SUBSTR (HexV, 2, 2) || SUBSTR (HexV, 0, 2) || SUBSTR (HexV, 10, 2) || SUBSTR (HexV, 8, 2) || SUBSTR (HexV, 14, 2) || SUBSTR (HexV, 12, 2) || SUBSTR (HexV, 16, 16) AS MyNETVal
FROM (SELECT RAWTOHEX (MyRAWCol) HexV FROM MyTable);
그러면 돌려받은 사람들을 먹일 수 있다.MyNETVal
new Guid (MyNETVal)
.
이 방법으로 코드는 항상 를 처리합니다.NET 형식 및 바이트 전환은 Oracle-DB에서 발생합니다.변환 코드로 코드를 폴리싱하지 않고 다른 DB로 전환해도 코드를 동일하게 유지할 수 있습니다.SQL만 변경해도 정상적으로 동작합니다.일부 DB는 Windows의 GUID 형식을 따르기 때문에 다른 DB를 사용하면 SQL이 더 단순해질 수 있습니다.
언급URL : https://stackoverflow.com/questions/7289734/convert-from-oracles-raw16-to-nets-guid
'programing' 카테고리의 다른 글
ui-select angular에서 선택한 옵션 지우기 (0) | 2023.03.08 |
---|---|
XML 대신 주석을 사용하여 Spring LdapTemplate를 구성하는 모범 사례 (0) | 2023.03.08 |
서버와 클라이언트 간의 데이터 자동 동기화 (0) | 2023.03.08 |
C# 클래스에서 JSON 스키마를 생성하는 중 (0) | 2023.02.26 |
Ajax 요청이 성공한 페이지 리디렉션 (0) | 2023.02.26 |