我们已经注意到,在生产数据中,一些与从.Net数据集存储到Oracle RAW列中的GUID有关的奇怪行为。

我们有以下设置:

  • 具有RAW列 Id
  • 表B 具有RAW列 ResponsibleObjectId

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

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

    在大多数情况下,这是可行的,但在少数情况下(如1/10.0000.000行),产生的引导并不完全相同:
    ResponsibleObjectId                 ID
    665B8FFDE5A04163A96D96A25702665B    665B8FFDE5A04163A96D96A257023065
    325C8AB000434503B8D2F980B33B325C    325C8AB000434503B8D2F980B33B4B58
    AF831B5207E04D2ABE0E3ADAC802AF83    AF831B5207E04D2ABE0E3ADAC8023FA1
    88DD5AF244DC4EA08075DB53CA1988DD    88DD5AF244DC4EA08075DB53CA19072E
    75A5E5111DEE4021BA6EB016178775A5    75A5E5111DEE4021BA6EB01617876E66
    

    他们匹配,期望最后4个字符。

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

    .Net DAL
    OracleCommand cmdSpInsert = (OracleCommand)database.GetStoredProcCommand("PKG_TableB.InsertTableB");
    database.AddInParameter(cmdSpInsert, "PAR_ResponsibleObjectId", DbType.StringFixedLength, 36, "ResponsibleObjectId", DataRowVersion.Current);
    

    Oracle SP
    PROCEDURE InsertTableB
    (
        ...
        PAR_ResponsibleObjectId IN CHAR,
        ...
    )
    IS BEGIN
        INSERT INTO StockMov
               (
                    ...
                    HEXTORAW(REPLACE(UPPER(PAR_ResponsibleObjectId), '-','')),
                    ...
               );
    END InsertTableB;
    

    我们不知道是什么导致了这种奇怪的行为。我们已经看到它在表A的2个不同列上也发生在类似的情况下,因此它似乎与表B没有特别的关系。

    如果需要任何其他信息,请询问,我将更新问题。

    在解决我们的奥秘方面,我们将不胜感激! :)

    编辑
    如评论中所问,ResponsibleObjectId列的分配非常简单,如下所示:
    dataSetB.ResponsibleObjectId = dataSetA.Id
    

    同样,两个数据集也保存在同一事务中。

    最佳答案

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

    dataSetA.Id = idGuid;

    dataSetB.ResponsibleObjectId = idGuid;

    /*不做dataSetB.ResponsibleObjectId = dataSetA.Id

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

    10-05 18:24