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 テーブルに書き戻せば、この問題は発生しません。
何が間違っているのですか?
ありがとう。