使用OleDbDataReader多线程读取SQL Server数据的技术问询
使用OleDbDataReader读取SQL Server数据的优化指南
看起来你正在用OleDbDataReader从SQL Server读取数据并映射到JPH实体,我先帮你把代码整理成规范格式(补全了截断的部分):
OleDbDataReader reader = command.ExecuteReader(); List<JPH> returnList = new List<JPH>(); while (reader.Read()) { JPH item = new JPH(); DateTime tmp = DBTypesEvaluator.ToDateTime(reader["POSITIONDATE"]); item.t = Functions.GetTimeFullStringSepFormat(tmp); item.lC = DBTypesEvaluator.ToString(reader["LOCATION"]); item.lT = DBTypesEvaluator.ToFloat(reader["LATITUDE"]); item.lN = DBTypesEvaluator.ToFloat(reader["LONGITUDE"]); // 推测补全截断的字段映射 // 其他实体属性的赋值逻辑... returnList.Add(item); }
下面给你几个实用的优化和注意点:
务必做好资源释放:
OleDbDataReader实现了IDisposable接口,直接创建而不释放容易导致数据库连接泄漏。推荐用using语句自动管理资源:using (OleDbDataReader reader = command.ExecuteReader()) { List<JPH> returnList = new List<JPH>(); while (reader.Read()) { // 你的实体赋值逻辑 } }用列索引代替硬编码列名:如果你的SQL查询语句是固定的,使用列的索引(比如
reader[0])代替字符串列名,不仅能提升读取性能,还能避免列名拼写错误带来的bug。处理数据库空值:数据库字段大概率会存在空值情况,直接转换容易引发异常。建议在转换前先判断是否为DBNull:
int positionDateOrdinal = reader.GetOrdinal("POSITIONDATE"); if (!reader.IsDBNull(positionDateOrdinal)) { DateTime tmp = DBTypesEvaluator.ToDateTime(reader[positionDateOrdinal]); item.t = Functions.GetTimeFullStringSepFormat(tmp); } else { // 根据业务需求处理空值,比如赋值默认值或空字符串 item.t = string.Empty; }考虑用ORM简化映射:如果这类实体映射代码很多,手动赋值会很繁琐。可以试试Dapper这类轻量级ORM,它能自动帮你把查询结果映射到实体,代码会简洁很多:
// 假设已经配置好SqlConnection(更推荐用SqlClient而非OleDb) using (var connection = new SqlConnection(connectionString)) { string sql = "SELECT POSITIONDATE, LOCATION, LATITUDE, LONGITUDE FROM YourTable"; List<JPH> returnList = connection.Query<JPH>(sql).ToList(); }优先用SqlClient访问SQL Server:OleDb是通用数据库访问组件,而
System.Data.SqlClient(或Microsoft.Data.SqlClient)是专门为SQL Server优化的,性能更好,兼容性也更强,建议替换成SqlClient相关类来操作SQL Server。
内容的提问来源于stack exchange,提问作者Burak Gur
相关产品推荐
相关产品推荐

