如何将包含Oracle Date的对象转换为DateTime?

时间:2013-07-24 15:16:36

标签: asp.net .net oracle odp.net

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

从该数组中,调用方法可以转换,例如,数字与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;
    }

2 个答案:

答案 0 :(得分:1)

DateTime.Parse(reader[column].ToString())

答案 1 :(得分:1)

OracleDateTime对象实际上是一个字节数组。另一种解决方案(不使用字符串转换)是:

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);