【发布时间】:2014-12-23 17:01:37
【问题描述】:
从包含出生日期的 SQL Server 查询加载数据。其中之一恰好是 1932 年 2 月 29 日。通过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"]);
}
...
【问题讨论】:
标签: c# sql-server oracle date