Raf*_*Raf 6 .net c# oracle guid
我们已经注意到我们的生产数据中有一些奇怪的行为,这些行为涉及我们从.Net DataSet存储到Oracle RAW列的GUID.
我们有以下设置:
当在表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)
两个数据集也保存在同一个事务中.
byte[] idGuid = Guid.NewGuid().ToByteArray();
dataSetA.Id = idGuid;
dataSetB.ResponsibleObjectId = idGuid;
/* 不执行 dataSetB.ResponsibleObjectId = dataSetA.Id
不进行任何数据类型转换 - 保持二进制/原始 */