OracleBulkCopy ORA-26041错误闰年1932年

时间:2014-12-23 17:01:38

标签: c# sql-server oracle date

从包含出生日期的SQL Server查询加载数据。其中一个恰好是2/29/1932。通过OracleBulkCopy将数据导入Oracle服务器时,出现ORA-26041错误。除了1932年以外,所有其他日期(包括闰年日期)都有效。切换到插入语句而不是OracleBulkCopy可以正常工作。日期值直接出自DataTable ='2/29/1932 12:00:00 AM'。该字段在SQL Server和Oracle中都具有Date数据类型。

使用Oracle.DataAccess 4.121.1.0 + .NET 4.5 x64 + Windows 7 + VS2012

代码:

... 
using (var da = new SqlDataAdapter(queryString, myConnectionString)) {
        da.SelectCommand.CommandTimeout = 0;
        da.AcceptChangesDuringUpdate = true;
        da.FillSchema(myDataset, SchemaType.Source, "MyDataTable");
        da.Fill(myDataset, "MyDataTable");
}

var clientInfo = OracleGlobalization.GetClientInfo();
clientInfo.DateFormat = "MM/DD/YYYY HH:MI:SS AM";
clientInfo.TimeStampFormat = "MM/DD/YYYY HH:MI:SS AM";
clientInfo.Language = "AMERICAN";

OracleGlobalization.SetThreadInfo(clientInfo);

var setDateFormatCommand = new OracleCommand("ALTER SESSION SET NLS_DATE_FORMAT='MM/DD/YYYY HH:MI:SS AM'", objConn);
setDateFormatCommand.ExecuteNonQuery();

var setTimeStampFormatCommand =
        new OracleCommand("ALTER SESSION SET NLS_TIMESTAMP_FORMAT='MM/DD/YYYY HH:MI:SS AM'", objConn);
setTimeStampFormatCommand.ExecuteNonQuery();

var setDateLanguageCommand =
        new OracleCommand("ALTER SESSION SET NLS_DATE_LANGUAGE=AMERICAN", objConn);
setDateLanguageCommand.ExecuteNonQuery();

using (var bulkCopy = new OracleBulkCopy(objConn)) {
        bulkCopy.BulkCopyTimeout = 20000;
        bulkCopy.BatchSize = 100000;
        bulkCopy.DestinationTableName = destinationTableName;
        bulkCopy.WriteToServer(myDataset.Tables["MyDataTable"]);
}
...

1 个答案:

答案 0 :(得分:0)

安装ODP.NET似乎是一个侥幸。我安装了最新版本12.1.0.2.1 32和64位ODP.NET,它恰好在问题发布日12/23/2014的同一天发布。这解决了这个问题。