以下方法使用OracleDataReader.GetValues()将SQL结果填充到对象数组中。如何将包含Oracle日期的对象转换为DateTime?
从该数组中,调用方法可以转换,例如,数字与Convert.ToInt64(row["FOO_COLUMN"])
多头,但不能可靠地得到一个日期。我不能使用TO_CHAR(some_date_format)
,因为此方法必须与SELECT * FROM ...
一起使用。
我试过检查每一列,看看它是否是一个OracleDate通过下面的三条评论代码。所讨论的if()语句的内容可能不正确,但它并不重要,因为if()条件永远不会被满足。
我已经搜索,但很惊讶,无论是我的搜索技能需要一些工作,也没有人问过这个问题,可能是前者。
public IDictionary<int, IDictionary<string, object>>
dbQuery(string sql, Dictionary<string, object> parameters = null, string connectionString = null) {
var dbResults = new Dictionary<int, IDictionary<string, Object>>();
if(connectionString == null) connectionString = this.defaultQueryConnectionString;
using(var con = new OracleConnection(connectionString)) {
using(var cmd = new OracleCommand(sql, con)) {
cmd.BindByName = true;
if(parameters != null) {
OracleParameter[] parameterArray = new OracleParameter[parameters.Count];
int parameterIndex = 0;
foreach(var parameter in parameters) {
parameterArray[parameterIndex] = new OracleParameter(parameter.Key, parameter.Value);
++parameterIndex;
}
cmd.Parameters.AddRange(parameterArray);
}
con.Open();
var reader = cmd.ExecuteReader();
int columnCount = reader.FieldCount;
object[] columns = new object[columnCount];
int rowNum = 0;
while(reader.Read()) {
reader.GetValues(columns);
var colval = new Dictionary<string, object>();
for(int columnIndex = 0; columnIndex < columnCount; ++columnIndex) {
//if(columns[columnIndex] is OracleDate) {
// columns[columnIndex] = Convert.ToDateTime(columns[columnIndex]);
//}
string colName = reader.GetName(columnIndex).ToUpperInvariant();
colval.Add(colName.ToUpperInvariant(), columns[columnIndex]);
}
dbResults.Add(rowNum, colval);
++rowNum;
}
}
}
return dbResults;
}
我想我可以在每次查询之前运行'alter session set nls_date_format ='some_format'。我希望能够直接转换检测列是OracleDate的方式,或者至少直接转换它,而不会混淆可能不可解析格式的字符串。尽管如此,“假设”没有人将全球日期格式改变为奇怪的东西,这确实奏效。 –
@CharlesBurns ToString发生在.NET CLR中,因此不受Oracle中的设置影响。你可以防范.Net本地化:http://stackoverflow.com/questions/16596231/convert-oracle-date-to-c-sharp-datetime – Geoff
啊。那么,在这种情况下,您的解决方案非常简单,我问这个问题几乎令人尴尬。没有什么比让我开始认为将是一个复杂问题的广泛,非常简单的解决方案让我更开心。 –