gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:51:02 24 4
gpt4 key购买 nike

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

我们有以下设置:

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

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

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

大多数情况下这是可行的,但在少数情况下(例如 1/10.000.000 行)生成的 guid 并不完全相同:

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);

甲骨文服务提供商

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

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

关于c# - 存储在 oracle 中的 GUID/RAW 几乎匹配,除了最后 4 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13600462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com