Asp.net 如何将包含Oracle日期的对象转换为DateTime?

Asp.net 如何将包含Oracle日期的对象转换为DateTime?,asp.net,.net,oracle,odp.net,Asp.net,.net,Oracle,Odp.net,下面的方法使用OracleDataReader.GetValues()将SQL结果填充到对象数组中 从该数组中,调用方法可以转换,例如,使用convert.ToInt64(row[“FOO_COLUMN”])将数字转换为long,但无法可靠地获取日期。我不能使用来创建字符(某些日期格式),因为该方法必须与选择*自…一起使用 我试着通过下面三行注释代码检查每一列,看它是否是OracleDate。所讨论的if()语句的内容可能不正确,但这并不重要,因为if()条件从未满足 我已经搜索过了,但很惊讶,

下面的方法使用OracleDataReader.GetValues()将SQL结果填充到对象数组中

从该数组中,调用方法可以转换,例如,使用
convert.ToInt64(row[“FOO_COLUMN”])
将数字转换为long,但无法可靠地获取日期。我不能使用
来创建字符(某些日期格式)
,因为该方法必须与
选择*自…
一起使用

我试着通过下面三行注释代码检查每一列,看它是否是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;
    }
公共词典
dbQuery(字符串sql,字典参数=null,字符串连接字符串=null){
var dbResults=newdictionary();
如果(connectionString==null)connectionString=this.defaultQueryConnectionString;
使用(var con=新的OracleConnection(connectionString)){
使用(var cmd=neworaclecommand(sql,con)){
cmd.BindByName=true;
if(参数!=null){
OracleParameter[]parameterArray=新的OracleParameter[parameters.Count];
int参数索引=0;
foreach(参数中的var参数){
parameterArray[parameterIndex]=新的OracleParameter(parameter.Key,parameter.Value);
++参数指标;
}
cmd.Parameters.AddRange(parameterArray);
}
con.Open();
var reader=cmd.ExecuteReader();
int columnCount=reader.FieldCount;
object[]columns=新对象[columnCount];
int rowNum=0;
while(reader.Read()){
reader.GetValues(列);
var colval=新字典();
对于(int columnIndex=0;columnIndex
OracleDateTime对象实际上是一个字节数组。另一种解决方案(不使用字符串转换)是:


我想我可以在每次查询之前运行
alter会话集nls\u date\u format='some\u format'
。我希望能找到一种直接转换的方法来检测列是否是OracleDate,或者至少直接转换它,而不会弄乱可能不可解析格式的字符串。不过,
假设没有人将全局日期格式更改为奇怪的格式,这确实有效。@CharlesBurns ToString发生在.Net CLR中,因此不受Oracle中设置的影响。你可以防止.Net本地化:啊。好吧,在这种情况下,你的解决方案很简单,我问这个问题几乎让人尴尬。没有什么比一个宽泛、非常简单的解决方案更让我开心的了,我开始认为这是一个复杂的问题。
DateTime.Parse(reader[column].ToString())
OracleDateTime oDT = (OracleDateTime) reader[column];
DateTime? myDT = null;
if(!oDT.IsNull)
    myDT = new DateTime(oDT.Year, oDT.Month, oDT.Day
                                   , oDT.Hour, oDT.Minute, oDT.Second);