MySQL BIT类型字段在C#中始终返回true的问题排查求助
解决MySQL BIT字段在C# MySQLDataReader中读取异常的问题
问题原因
MySQL Connector/NET 会将BIT类型字段默认以byte[](字节数组)的形式返回,哪怕是BIT(1)类型。你之前尝试的直接强制转换或Convert方法,要么因为类型不匹配报错,要么因为非空数组被判定为true,导致无论实际存储的是0还是1都得到错误结果。
解决方案
方案1:读取字节数组后解析实际值
直接将读取到的字段转为字节数组,再通过数组第一个元素判断实际值(BIT(1)对应长度为1的数组):
if (!MyReader.IsDBNull(MyReader.GetOrdinal("Field"))) { byte[] bitBytes = (byte[])MyReader["Field"]; bool myValue = bitBytes[0] == 1; // 也可转为数值类型 int intValue = bitBytes[0]; }
方案2:在SQL查询中转换BIT字段类型
如果不想处理字节数组,可以在查询时将BIT字段转为无符号整数,不影响原有表结构,读取时直接按常规数值处理:
SELECT id, CAST(your_bit_field AS UNSIGNED) AS your_bit_field, other_fields FROM your_table;
之后在C#中正常读取:
bool myValue = Convert.ToBoolean(MyReader["your_bit_field"]); // 或者直接转int int intValue = Convert.ToInt32(MyReader["your_bit_field"]);
方案3:修改连接字符串参数
在数据库连接字符串中添加Treat Bit As Boolean=True,让Connector/NET自动将BIT(1)字段转为bool类型:
Server=your_server;Database=your_db;Uid=user;Pwd=password;Treat Bit As Boolean=True;
注意:该参数仅对BIT(1)类型生效,若为BIT(n)(n>1)的字段,依然会返回字节数组。
内容的提问来源于stack exchange,提问作者falcala
相关产品推荐
相关产品推荐

