0

Oracle ODP.NET (リリース 5 (11.2.0.3.20)) 経由で OracleBulkCopy を使用して、.NET データベースを Oracle に渡そうとしています。

        // Copy table to Oracle
        OracleBulkCopy bulkCopy = new OracleBulkCopy(cmdOra.Connection);
        bulkCopy.DestinationTableName = "INBOUND_JOB_TMP";

        bulkCopy.BatchSize = 10000;
        bulkCopy.BulkCopyTimeout = 300;
        bulkCopy.WriteToServer(dtJobs);

        bulkCopy.Dispose();
        bulkCopy = null;

ジョブは SQL Server データベースから取得されます。

        SqlDataReader reader;
        cmdSql.CommandTimeout = 120;
        cmdSql.CommandType = CommandType.StoredProcedure;
        cmdSql.CommandText = "DOWNLOAD_JOBS";
        cmdSql.Parameters.Clear();
        reader = cmdSql.ExecuteReader();

        // Retrieve Job records
        dtJobs = new DataTable();
        if (reader.HasRows)
        {
            dtJobs.Load(reader);
        }
        else
            Trace.WriteLine("No rows returned.");

渡されるフィールドの 1 つが署名フィールドです。

    SQL Server:

    CREATE TABLE [dbo].[JOBS_DOWNLOAD](
        [UniqueId] [int] IDENTITY(1,1) NOT NULL,
        [MobileJobNo] [varchar](20) NOT NULL,
        [MobileJobStatus] [varchar](1) NULL,
        [TenantSignatureImage] [varbinary](max) NULL,
    PRIMARY KEY CLUSTERED 
    (
        [UniqueId] ASC
    )


    Oracle:

    CREATE TABLE "DBA"."INBOUND_JOB_TMP" 
       ("UNIQUE_ID" NUMBER(20,0), 
        "MOBILE_JOB_NO" VARCHAR2(20) NOT NULL ENABLE, 
        "TENANT_SIGNATURE" BLOB) ;

このコードを実行してデータの行を Sql Server から Oracle にコピーすると、正常に動作します。署名画像がコピーされます。

ただし、署名画像のサイズが約 4K より大きい場合は、次のエラー メッセージが表示されます。

    Oracle.DataAccess.Client.OracleException was unhandled by user code
      HResult=-2147467259
      Message=Error in row '1' column '1'
    ORA-39776: fatal Direct Path API error loading table DBA.INBOUND_JOB_TMP 
    ORA-00600: internal error code, arguments: [25029], [2147483647], [], [], [], [], [], [], [], [], [], []
      Source=Oracle Data Provider for .NET
      ErrorCode=-2147467259
      DataSource=""
      Number=-2754
      Procedure=""
      StackTrace:
           at Oracle.DataAccess.Client.OracleBulkCopy.PerformBulkCopy()
           at Oracle.DataAccess.Client.OracleBulkCopy.WriteDataSourceToServer()
           at Oracle.DataAccess.Client.OracleBulkCopy.WriteToServer(DataTable table, DataRowState rowState)
           at Oracle.DataAccess.Client.OracleBulkCopy.WriteToServer(DataTable table)
           at JobDataSync.SyncTables.Jobs.PostJobs() in C:\Development\JobSyncService\JobDataSync\SyncTables\Jobs.cs:line 114
           at JobDataSync.SyncTables.Jobs.Sync() in C:\Development\JobSyncService\JobDataSync\SyncTables\Jobs.cs:line 42
           at JobDataSync.TransactionalDataSync.SyncData() in C:\Development\JobSyncService\JobDataSync\TransactionalDataSync.cs:line 73
           at JobDataSyncConsole.DebugConsole.syncTimer_Elapsed(Object sender, ElapsedEventArgs e) in C:\Development\JobSyncService\JobDataSync\Console\DebugConsole.cs:line 74
           at System.Timers.Timer.MyTimerCallback(Object state)
      InnerException: 

SQL Server テーブルに書き戻せば、この問題は発生しません。

何が間違っているのですか?

ありがとう。

4

1 に答える 1

1

この問題は、標準のデータベース テーブルではなく、グローバル一時テーブルとして定義された Oracle テーブルにデータをプッシュするときに発生します。

Oracle サポート ログが発生しました。

于 2013-01-24T11:32:42.240 に答える