将字节数组从Oracle RAW转换为System.Guid?

Cor*_*rty 10 .net c# oracle ado.net guid

我的应用程序使用DataReader在ADO.NET中编写的自定义数据访问层与Oracle和SQL Server数据库进行交互.现在我遇到了GUID(我们用于主键)和Oracle RAW数据类型之间转换的问题.插入oracle很好(我只是在System.Guid上使用ToByteArray()方法).当我从数据库加载记录时,问题是转换回System.Guid.目前,我正在使用从ADO.NET获得的字节数组传递给System.Guid的构造函数.这似乎有效,但数据库中出现的Guids与我以这种方式生成的Guids不对应.

我无法更改数据库架构或查询(因为它重用于SQL Server).我需要代码将Oracle中的字节数组转换为正确的Guid.

Cor*_*rty 5

事实证明,问题是你得到的字节顺序Guid.ToByteArray()而不是Oracle本身.如果你带着Guid" 11223344-5566-7788-9900-aabbccddeeff"并打电话ToByteArray()给它,你会得到" 44332211665588779900AABBCCDDEEFF".如果然后将该字节数组传递回Guid的构造函数,则会获得原始Guid.我的错误是尝试通过原始Guid格式(删除破折号)查询Oracle数据库,而不是ToByteArray()调用的结果.

我仍然不知道为什么字节按这种方式排序,但它显然与Oracle无关.


sam*_*ric 5

我在从 Oracle 存储和读取 Guid 时遇到了同样的问题。

如果您的应用程序需要存储和读取 Oracle 中的 Guid,请使用此线程中的 FlipEndian 函数:

.NET 本机 GUID 转换

Byte[] rawBytesFromOracle;
Guid dotNetGuid = new Guid(rawBytesFromOracle).FlipEndian();
Run Code Online (Sandbox Code Playgroud)

仅当从 Oracle 读回时才需要翻转。

写入 Oracle 时,照常使用 Guid.ToByteArray()。

我花了太多时间试图完成这个简单的任务。

史蒂夫