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.
事实证明,问题是你得到的字节顺序Guid.ToByteArray()
而不是Oracle本身.如果你带着Guid" 11223344-5566-7788-9900-aabbccddeeff
"并打电话ToByteArray()
给它,你会得到" 44332211665588779900AABBCCDDEEFF
".如果然后将该字节数组传递回Guid的构造函数,则会获得原始Guid.我的错误是尝试通过原始Guid格式(删除破折号)查询Oracle数据库,而不是ToByteArray()
调用的结果.
我仍然不知道为什么字节按这种方式排序,但它显然与Oracle无关.
我在从 Oracle 存储和读取 Guid 时遇到了同样的问题。
如果您的应用程序需要存储和读取 Oracle 中的 Guid,请使用此线程中的 FlipEndian 函数:
Byte[] rawBytesFromOracle;
Guid dotNetGuid = new Guid(rawBytesFromOracle).FlipEndian();
Run Code Online (Sandbox Code Playgroud)
仅当从 Oracle 读回时才需要翻转。
写入 Oracle 时,照常使用 Guid.ToByteArray()。
我花了太多时间试图完成这个简单的任务。
史蒂夫