2013-07-24 58 views
2

以下方法使用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; 
    } 

回答

1
DateTime.Parse(reader[column].ToString()) 
+0

我想我可以在每次查询之前运行'alter session set nls_date_format ='some_format'。我希望能够直接转换检测列是OracleDate的方式,或者至少直接转换它,而不会混淆可能不可解析格式的字符串。尽管如此,“假设”没有人将全球日期格式改变为奇怪的东西,这确实奏效。 –

+1

@CharlesBurns ToString发生在.NET CLR中,因此不受Oracle中的设置影响。你可以防范.Net本地化:http://stackoverflow.com/questions/16596231/convert-oracle-date-to-c-sharp-datetime – Geoff

+0

啊。那么,在这种情况下,您的解决方案非常简单,我问这个问题几乎令人尴尬。没有什么比让我开始认为将是一个复杂问题的广泛,非常简单的解决方案让我更开心。 –

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); 
相关问题