MySqlDataReader无法读取含自定义函数的MySQL视图的information_schema元数据
问题根因
- MySql.Data 8.0.27存在已知的元数据解析bug:当视图包含返回TEXT类型的自定义函数字段时,驱动读取information_schema.columns的结果时会出现内部静默异常,导致
ExecuteReader返回的结果集为空,所以reader.Read()直接返回false,循环不会执行。你手动执行SQL能拿到结果,是因为原生MySQL客户端没有该解析缺陷。 - 字符集匹配问题:你的自定义函数声明返回utf8编码的TEXT类型,若连接字符串未显式指定字符集,驱动在预解析字段元数据时会因编码不兼容跳过结果集。
- NULL值处理缺陷:当
JSON_ARRAYAGG无匹配数据时会返回NULL,该版本驱动对视图中函数返回的NULL TEXT类型处理逻辑有问题,会直接终止结果集枚举。
解决方案
- 优先将MySql.Data包升级到8.0.33及以上版本,该bug已被官方修复。如果受项目依赖限制无法升级,可以替换为MySqlConnector驱动,对这类元数据解析场景的兼容性更好。
- 在数据库连接字符串中显式添加
CharSet=utf8mb4;参数,强制驱动使用统一编码解析所有文本类型字段,避免编码解析异常。 - 调整自定义函数逻辑,添加NULL值兜底:在RETURN语句前增加
IF result IS NULL THEN SET result = '[]'; END IF;,保证函数永远返回非空的TEXT内容,规避驱动的NULL值处理缺陷。 - 临时适配方案:将查询元数据的SQL替换为
DESCRIBE {0},该语句返回的字段元数据结构更简单,旧版本驱动解析不会出现异常。 - 补充异常捕获逻辑:检查你的代码外层try-catch是否吞掉了
MySqlException,确认是否有隐藏的报错导致执行流程直接跳过了Read循环。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

