如何解决OleDb查询Excel结果转泛型Tuple时的类型不匹配问题
解决方案
核心逻辑为通过泛型参数的类型信息获取Tuple每个元素的目标类型,再套用类型转换即可解决OleDb读取Excel时的类型不匹配问题。
修复后的完整代码
public T ExecuteTuple<T>(string sqlStatement, IEnumerable<OleDbParameter> parameters) where T : ITuple, struct { using var connection = new OleDbConnection(connectionString); using var command = new OleDbCommand(sqlStatement, connection); command.Parameters.AddRange(parameters.ToArray()); connection.Open(); using var reader = command.ExecuteReader(); T results = default; // 获取Tuple所有元素的目标类型数组 Type[] tupleElementTypes = typeof(T).GetGenericArguments(); int tupleFields = tupleElementTypes.Length; // 无查询结果时直接返回默认值 if (!reader.Read()) { return results; } for (int i = 0; i < tupleFields; ++i) { object tupleObject = results; object rawValue = reader.GetValue(i); object setValue = default; if (rawValue != DBNull.Value) { Type targetType = tupleElementTypes[i]; // 兼容可空类型的场景 Type underlyingType = Nullable.GetUnderlyingType(targetType); if (underlyingType != null) { targetType = underlyingType; } setValue = Convert.ChangeType(rawValue, targetType); } results.GetType().GetField($"Item{i + 1}")?.SetValue(tupleObject, setValue); results = (T)tupleObject; } return results; }
关键改动说明
- 新增
where T : ITuple, struct约束,适配C#值Tuple的类型特征 - 通过
typeof(T).GetGenericArguments()直接获取Tuple每个位置的目标类型,解决你之前找不到元素类型的问题 - 增加可空类型适配逻辑,支持Tuple中使用
int?这类可空类型的场景 - 增加查询无结果的判断逻辑,避免空行读取报错
- 类型转换逻辑和你原有单值转换逻辑完全对齐,解决Excel读取数值默认返回
double导致的赋值失败问题
内容的提问来源于stack exchange,提问作者jonyfries
相关产品推荐
相关产品推荐

