代码之家  ›  专栏  ›  技术社区  ›  Cory McCarty

将字节数组从oracle raw转换为system.guid?

  •  9
  • Cory McCarty  · 技术社区  · 15 年前

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

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

    3 回复  |  直到 9 年前
        1
  •  5
  •   Cory McCarty    15 年前

    结果发现问题是你输入的字节顺序 Guid.ToByteArray() 而不是甲骨文本身。如果您使用guid“ 11223344-5566-7788-9900-aabbccddeeff “然后打电话 ToByteArray() 在它上面,你得到” 44332211665588779900AABBCCDDEEFF “。然后,如果将该字节数组传递回guid的构造函数,则会得到原始guid。我的错误是试图用原始的guid格式(删除破折号)而不是 ToByTurr() 打电话。

    我仍然不知道为什么字节是这样排列的,但是它显然与Oracle无关。

        2
  •  4
  •   Community CDub    8 年前

    在存储和读取Oracle的guid时,我也遇到了同样的问题。

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

    .NET Native GUID conversion

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

    只有在从Oracle读取数据时才需要翻转。

    在写入Oracle时,请正常使用guid.tobytearray()。

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

    史蒂夫

        3
  •  0
  •   Jon Skeet    15 年前

    我模糊地记得Oracle的guid与.NET期望的顺序相比,实际上是颠倒的。

    在调用 Guid 构造函数。

    它可能不是 相当地 不过,简单地说,您可能需要进行更详细的交换。我建议您创建一个guid,其中每个字节都易于识别(使用0x01、0x23、0x45等),并从中进行工作。

    推荐文章