Oracle数据库日期显示异常及获取最后修改日期的C#代码问题
解决Oracle日期读取后显示异常的问题
这个问题很典型,核心原因是日期类型处理不当+文化差异导致的格式解析错误:Oracle里存储的04-DEC-20是12月4日,但你的C#代码用GetValue返回的object在ToString时,可能因为当前线程的文化设置不识别英文月份缩写DEC,错误地把它解析成了9月(比如某些非英文文化里没有DEC这个缩写,或者默认解析逻辑出了问题),最终变成了04-09-2020。
下面是具体的修复方案,分两种场景处理:
场景1:LASTMODIFIED是Oracle DATE类型(推荐)
如果你的表中LASTMODIFIED字段是Oracle原生的DATE类型,直接用GetDateTime方法读取,确保拿到正确的DateTime对象,再指定格式输出:
string connString = DBUtils.GetDBConnection(); // 用using自动释放连接资源,避免泄漏 using (OracleConnection conn = new OracleConnection(connString)) { string sql = "select LASTMODIFIED , name from v_vname where name in('hector')"; using (OracleCommand cmd = new OracleCommand(sql, conn)) { conn.Open(); using (DbDataReader reader = cmd.ExecuteReader()) { if (reader.HasRows) { while (reader.Read()) { int dateOrdinal = reader.GetOrdinal("LASTMODIFIED"); // 直接读取为DateTime类型,绕开object转义的不确定性 DateTime lastModified = reader.GetDateTime(dateOrdinal); // 用InvariantCulture确保英文月份缩写被正确识别和输出 Console.WriteLine("modifieddate:" + lastModified.ToString("dd-MMM-yy", System.Globalization.CultureInfo.InvariantCulture)); // 如果需要完整年份格式,可替换为: // Console.WriteLine("modifieddate:" + lastModified.ToString("dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture)); } } } } }
场景2:LASTMODIFIED是字符串类型(不推荐,但如果是这种情况)
如果字段是用字符串存储的日期,需要用ParseExact指定解析格式和文化,彻底避免歧义:
string connString = DBUtils.GetDBConnection(); using (OracleConnection conn = new OracleConnection(connString)) { string sql = "select LASTMODIFIED , name from v_vname where name in('hector')"; using (OracleCommand cmd = new OracleCommand(sql, conn)) { conn.Open(); using (DbDataReader reader = cmd.ExecuteReader()) { if (reader.HasRows) { while (reader.Read()) { int dateOrdinal = reader.GetOrdinal("LASTMODIFIED"); string dateStr = reader.GetString(dateOrdinal); // 明确指定解析格式为dd-MMM-yy,并用InvariantCulture确保DEC被识别为12月 DateTime lastModified = DateTime.ParseExact(dateStr, "dd-MMM-yy", System.Globalization.CultureInfo.InvariantCulture); Console.WriteLine("modifieddate:" + lastModified.ToString("dd-MMM-yy", System.Globalization.CultureInfo.InvariantCulture)); } } } } }
额外注意事项
- 尽量用Oracle原生DATE/TIMESTAMP类型存储日期,不要用字符串,从根源避免格式解析的各种问题。
- 操作日期时始终指定
CultureInfo.InvariantCulture(或明确指定en-US文化),避免系统默认文化带来的解析/输出偏差。 - 代码中务必用
using语句自动释放资源(修复代码中已补充,原代码里的OracleConnection未用using,存在资源泄漏风险)。
内容的提问来源于stack exchange,提问作者manvitha
相关产品推荐
相关产品推荐

