2010-04-19 58 views
8

我的應用程序使用使用DataReader在ADO.NET中編寫的自定義數據訪問層與Oracle和SQL Server數據庫交互。現在我遇到了GUID(我們用於主鍵)和Oracle RAW數據類型之間轉換的問題。插入到oracle是好的(我只是在System.Guid上使用ToByteArray()方法)。當我從數據庫加載記錄時,問題是轉換回System.Guid。目前,我使用從ADO.NET獲得的字節數組傳遞給System.Guid的構造函數。這似乎正在工作,但出現在數據庫中的Guids與我以這種方式生成的Guids不相符。將字節數組從Oracle RAW轉換爲System.Guid?

我無法更改數據庫模式或查詢(因爲它已重用於SQL Server)。我需要將Oracle的字節數組轉換爲正確的Guid。

+0

您是否有存儲GUID的任何示例以及存儲時的值? – Richard 2010-04-19 13:33:42

+0

您是否將oracle保存爲oracle中的字節數組? – Peter 2010-04-19 13:36:47

回答

4

事實證明,問題是您在Guid.ToByteArray()中獲得的字節順序,而不是Oracle本身。如果您採用Guid「11223344-5566-7788-9900-aabbccddeeff」並致電ToByteArray()就可以得到「44332211665588779900AABBCCDDEEFF」。如果您將該字節數組傳回到Guid的構造函數中,您將獲得原始的Guid。我的錯誤是試圖通過原始Guid格式(刪除破折號)來查詢Oracle數據庫,而不是調用ToByteArray()的結果。

我仍然不知道爲什麼字節按這種方式排序,但它顯然與Oracle無關。

+0

這就是爲什麼..... http://stackoverflow.com/questions/9195551/why-does-guid-tobytearray-order-the-bytes-the-way-it-does – samneric 2015-10-06 13:44:21

0

我有模糊的記憶,Oracle的GUID與.NET預期的順序相比被有效地顛倒過來。

嘗試在調用Guid構造函數之前顛倒數組。

它可能不是相當於就像倒車一樣簡單 - 但是 - 您可能需要做更詳細的交換。我建議你創建一個GUID,每個字節很容易識別(使用0x01,0x23,0x45等)並從那裏開始工作。

+0

感謝您的回答。這是不正確的,因爲我問的是錯誤的問題。不過,你的建議確實讓我得到了正確的答案。 – 2010-04-23 16:43:47

3

我剛剛從Oracle存儲和讀取Guids時遇到了同樣的問題。

如果您的應用需要存儲和讀出甲骨文的GUID,使用FlipEndian功能,從這個線程:

.NET Native GUID conversion

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

翻轉閱讀從Oracle回來的時候,才需要。

寫入Oracle時,通常會使用Guid.ToByteArray()。

我花了很多時間試圖完成這個簡單的任務。

Steve