存储在oracle中的GUID/RAW几乎匹配,除了最后4个字符

Raf*_*Raf 6 .net c# oracle guid

我们已经注意到我们的生产数据中有一些奇怪的行为,这些行为涉及我们从.Net DataSet存储到Oracle RAW列的GUID.

我们有以下设置:

  • 表A具有RAW列Id
  • 表B有一个RAW列ResponsibleObjectId

当在表A的函数中创建表A时,ResponsibleObjectId列填充表A的ID(并非总是如此,因此列上没有FK).

这发生在我们的.Net服务器层.这两个表位于2个单独的DataSet中.然后将这2个数据集保存到oracle DB(11g).

大部分时间都有效,但在少数情况下(如1/10.000.000行),生成的guid不完全相同:

ResponsibleObjectId                 ID
665B8FFDE5A04163A96D96A25702665B    665B8FFDE5A04163A96D96A257023065
325C8AB000434503B8D2F980B33B325C    325C8AB000434503B8D2F980B33B4B58
AF831B5207E04D2ABE0E3ADAC802AF83    AF831B5207E04D2ABE0E3ADAC8023FA1
88DD5AF244DC4EA08075DB53CA1988DD    88DD5AF244DC4EA08075DB53CA19072E
75A5E5111DEE4021BA6EB016178775A5    75A5E5111DEE4021BA6EB01617876E66
Run Code Online (Sandbox Code Playgroud)

他们匹配,期待最后4个字符.

我们使用存储过程保存GUID,如下所示:

.Net DAL

OracleCommand cmdSpInsert = (OracleCommand)database.GetStoredProcCommand("PKG_TableB.InsertTableB");
database.AddInParameter(cmdSpInsert, "PAR_ResponsibleObjectId", DbType.StringFixedLength, 36, "ResponsibleObjectId", DataRowVersion.Current);
Run Code Online (Sandbox Code Playgroud)

Oracle SP

PROCEDURE InsertTableB
(
    ...
    PAR_ResponsibleObjectId IN CHAR,
    ...
)
IS BEGIN
    INSERT INTO StockMov
           (
                ...
                HEXTORAW(REPLACE(UPPER(PAR_ResponsibleObjectId), '-','')),
                ...
           );
END InsertTableB;
Run Code Online (Sandbox Code Playgroud)

我们不知道造成这种奇怪行为的原因.我们已经在表A中的2个不同列上看到它发生在一个类似的情况下,所以它似乎与表B没有特别的关系.

如果需要任何额外信息,请询问,我会更新问题.

任何帮助都非常感谢我们解开我们的神秘面纱!:)

编辑 正如评论中所要求的,ResponsibleObjectId列的赋值非常简单,如下所示:

dataSetB.ResponsibleObjectId = dataSetA.Id
Run Code Online (Sandbox Code Playgroud)

两个数据集也保存在同一个事务中.

RMA*_*ess 3

byte[] idGuid = Guid.NewGuid().ToByteArray();

dataSetA.Id = idGuid;

dataSetB.ResponsibleObjectId = idGuid;

/* 不执行 dataSetB.ResponsibleObjectId = dataSetA.Id

不进行任何数据类型转换 - 保持二进制/原始 */