6

.Net DataSet から Oracle RAW 列に格納している GUID に関して、本番データに奇妙な動作があることに気付きました。

次の設定があります。

  • テーブル Aには RAW 列IDがあります
  • テーブル Bには RAW 列ResponsibleObjectIdがあります

ResponsibleObjectId 列には、テーブル A の関数で作成されたときにテーブル A の ID が入力されます (常にそうであるとは限らないため、列に FK はありません)。

これは、.Net サーバー層で発生します。2 つのテーブルは 2 つの別個の DataSet にあります。これらの 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);

オラクル 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

また、2 つのデータセットは同じトランザクションで保存されます。

4

2 に答える 2

3

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

dataSetA.Id = idGuid;

dataSetB.ResponsibleObjectId = idGuid;

/* しません dataSetB.ResponsibleObjectId = dataSetA.Id

データ型の変換を行わないでください - バイナリ/生のままにしてください */

于 2012-12-05T14:43:08.243 に答える
0

これらの問題が発生したのは、データベースのセットアップが私たちの要件に従わなかったために発生したという非常に強い兆候がいくつかあります。oracel db は専用マシンで実行されておらず、十分なメモリがありませんでした。

多くの場合、インシデントは RAC の問題と一致する可能性があります。

私たちは今、顧客に db サーバーをアップスケールするよう説得しようとします。

于 2013-03-21T09:40:23.967 に答える