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