我们已经注意到,在生产数据中,一些与从.Net数据集存储到Oracle RAW列中的GUID有关的奇怪行为。
我们有以下设置:
当在表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
不进行任何数据类型转换-保持二进制/原始*/