下面的方法使用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;
}
答案 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);