从包含出生日期的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"]);
}
...
答案 0 :(得分:0)
安装ODP.NET似乎是一个侥幸。我安装了最新版本12.1.0.2.1 32和64位ODP.NET,它恰好在问题发布日12/23/2014的同一天发布。这解决了这个问题。