读取MySQL表到DataTable时DECOMPRESS后Value字段为null的问题
解决方法
1. 为DECOMPRESS结果添加列别名
你的查询语句中,DECOMPRESS(Value)未指定列名,导致DataTable中该列的名称是DECOMPRESS(Value),而非Value。后续映射到Record类的Value属性时无法匹配,最终显示为null。修改查询语句,给解压后的字段添加别名:
SELECT Name, DECOMPRESS(Value) AS Value FROM myTable
这样DataTable会生成名为Value的列,后续通过JArray.FromObject(data)转换为List<Record>时,就能正确将解压后的数据赋值给Record的Value属性。
2. 手动使用DataReader填充DataTable(若DataAdapter仍有问题)
如果添加别名后仍无法获取数据,可尝试手动通过MySqlDataReader读取并填充DataTable,避免DataAdapter的自动解析问题:
var queryString = "SELECT Name, DECOMPRESS(Value) AS Value FROM myTable"; var data = new DataTable(); using (var cmd = new MySqlCommand(queryString, myMySqlConnection)) { await myMySqlConnection.OpenAsync(); using (var reader = await cmd.ExecuteReaderAsync()) { // 直接加载整个reader到DataTable,无需while循环 data.Load(reader); } } results = JArray.FromObject(data).ToObject<List<Record>>();
注意:data.Load(reader)会一次性读取reader中的所有数据并填充到DataTable,不要在while(reader.Read())循环中调用,否则会因reader状态异常报错。
3. 验证DECOMPRESS的有效性
确保原Value字段是通过COMPRESS()函数压缩的二进制数据。如果原始数据不是合法的压缩格式,DECOMPRESS()会返回null。可以先在MySQL客户端执行以下查询,验证解压结果:
SELECT Name, DECOMPRESS(Value) FROM myTable LIMIT 1;
如果查询返回null,说明原始数据不是有效压缩格式,需先排查数据本身的问题。
内容的提问来源于stack exchange,提问作者Harry Adams
相关产品推荐
相关产品推荐

