2011-09-02 10 views
27

में कनवर्ट करें मुझे मैन्युअल रूप से .NET अनुप्रयोग को डीबग करने में कठिनाई हो रही है जहां GUID मान .NET से Oracle से भिन्न होते हैं।ओरेकल के रॉ (16) से .NET के GUID

  • कहाँ सी # में लिखा है:
    • 17D89D326C2142D69B989F5201288DBF
  • ओरेकल पढ़ता है:
    • 329DD817216CD6429B989F5201288DBF

मैं कैसे करने में सक्षम होगा मैन्युअल रूप से डीबग करें, यानी, सी # के GUID से उस ऑब्जेक्ट क्वेरी में उस मान को पेस्ट करने में सक्षम हो और सही परिणाम (और उपाध्यक्ष) प्राप्त करें?

+0

संभावित डुप्लिकेट [System.Guid को ओरेकल रॉ से बाइट सरणी में कनवर्ट करें?] (Http://stackoverflow.com/questions/2667740/convert-byte-array-from-oracle-raw-to -सिस्टम-गाइड) –

उत्तर

38

यदि आप हेक्स अंकों के शामिल (जोड़े में) मानों को देखते हैं तो आप देख सकते हैं कि पिछले 7 बाइट दोनों मामलों में समान हैं, लेकिन पहले 9 को थोड़ा सा स्विच किया जाता है।

अपने उदाहरण से जा रहे हैं, लेकिन जैसा कि 00, 11, 22 आदि .NET में प्रत्येक जोड़ी फिर से लिखने और ओरेकल के प्रासंगिक बाइट स्विचिंग रूप में अच्छी तरह हम पाते हैं:

  • नेट:

    00112233445566778899AABBCCDDEEFF 
    
  • ओरेकल:

    33221100554477668899AABBCCFFEEFF 
    

तो प्रासंगिक बाइट्स को घुमाने के लिए कोड लिखना काफी आसान होना चाहिए। (मैं यकीन है कि मैं वास्तव में एक पिछले काम में ऐसा करने के लिए, कुछ कोड लिखा हूँ।)

बाइट्स दौर के लिए, आपको सिर्फ Guid.ToByteArray() और new Guid(byte[]) कॉल करने के लिए वापस एक Guid को पाने के लिए चाहता हूँ।

संपादित करें: यह होता है, स्विच दौर ऊपर है वास्तव में क्या 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 

कि हो सकता है अच्छी तरह से स्विचिंग करने के लिए इसे काफी आसान बनाते हैं ... आप मूल्यों को कैसे शुरू कर रहे थे? क्या यह सिर्फ "ओरेकल में उन्हें कैसे प्रदर्शित किया जाता है"?

संपादित करें: ठीक है, यहाँ रूपांतरण कार्यों के एक जोड़े हैं - अगर आप पाठ के रूप में डेटा मिल गया है, वे एक तरह से बदल देंगे ...

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

} 
+0

यह पता चला है कि यह ओरेकल नहीं है जो कि चीजें हैं। यह Guid.ToByteArray() और ग्रिड कन्स्ट्रक्टर है जो बाइट सरणी को इसके पैरामीटर के रूप में लेता है। मुझे नहीं पता कि यह ऐसा क्यों करता है, और मैंने यहां एक प्रश्न पोस्ट किया है जो वास्तव में यहां पूछ रहा है: http://stackoverflow.com/questions/9195551/why-does-guid-tobytearray-order-the-bytes-the-way -it-करता है –

1

बस हमेशा में अपने मानक GUID का उपयोग करें। नेट ...

जब आप ओरेकल में कुछ GUID तुम सिर्फ फोन 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; 

आप ओरेकल से एक RAW आप उपयोग पढ़ते हैं :

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

तो फिर तुम new Guid (MyNETVal) में लौटे MyNETVal फ़ीड कर सकते हैं।

इस प्रकार आपका कोड हमेशा .NET प्रारूप से संबंधित होता है और बाइट स्विचिंग ओरेकल-डीबी में होती है ... आप अपने कोड को रूपांतरण कोड के साथ विनियमित नहीं करते हैं और कोड कोड को उसी स्थान पर रख सकते हैं जब दूसरे पर स्विचिग हो डीबीएस - बस एसक्यूएल बदल सकते हैं और आप सक्रिय होकर चलने लगेंगे ... एसक्यूएल अन्य डीबीएस के साथ सरल हो सकता है क्योंकि उनमें से कुछ Windows के GUID प्रारूप का पालन ...

+0

जो ओपी पूछ रहा है वह नहीं है। अगर मुझे पता था कि .NET आईडी को खराब कर देगा तो मैं सीधे VARCHAR2 का चयन करूंगा। लेकिन अब बहुत देर हो चुकी है, अब मुझे यह समझने की जरूरत है कि उन्हें कैसे मिलान किया जाए – Toolkit

4

आप के लिए एक GUID कन्वर्ट करने के लिए की जरूरत है

/* 
    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; 
: रॉ पी एल से/एसक्यूएल इस सुविधा का उपयोग कर सकते हैं
3

ओरेकल से ग्रिड को संग्रहीत और पढ़ने के दौरान मुझे यह वही समस्या थी।

जॉन की जवाब क्वेरी करने के लिए सही है, लेकिन अपने app की दुकान और Oracle से GUIDs को पढ़ने के लिए की जरूरत है, इस सूत्र से FlipEndian समारोह का उपयोग करें:

.NET Native GUID conversion

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

फ्लिप जब पढ़ने केवल आवश्यक है ओरेकल से वापस।

ओरेकल को लिखते समय Guid.ToByteArray() सामान्य के रूप में उपयोग करते हैं।

मैंने इस सरल कार्य को पूरा करने के लिए बहुत समय बिताया।

स्टीव

की
संबंधित मुद्दे