2

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

从该数组中,调用方法可以将数字转换为 long 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;
    }
4

2 回答 2

1
DateTime.Parse(reader[column].ToString())
于 2013-07-24T15:22:13.287 回答
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);
于 2014-03-14T15:36:51.077 回答