mysql中的val_为什么new MySqlParameter("@val", 0).Value == null?

博客作者在使用MySql.Data时遇到一个奇怪的问题,即0值在插入MySQL数据表时变为null。经过源码调试发现,0被误转换为MySqlDbType.Decimal,导致DbParameter.Value为null。这个问题源于0被错误地解析为枚举类型而非整数。解决方案是显式将0转换为object类型。这个博客揭示了数据库操作中可能存在的类型转换隐患。
摘要由CSDN通过智能技术生成

前阵子同事写代码时发现MySQL数据表中经常被神奇的插入了空值,跟踪了半天代码,终于发现了问题所在:

DbParameter p = new MySqlParameter("@val", 0);

Debug.Assert(p.Value == 0);  // 这里断言失败,p.Value实际是null

分析了半天,没找到原因。猜想是MySql.Data把0当作null来处理了。心想,这不应该啊,完全没理由的事情啊,0在数据库里是个多么正常不过的值啊!心有不甘,于是把MySql.Data的源代码下载下来调试跟踪……然后发现了一个不得了的事情

MySqlParameter有几个构建函数,其中有两个是这么申明的

public MySqlParameter(string name, object value) {

// ......

}

public MySqlParameter(string name, MySqlDbType type) {

// ......

// MySqlDbType是个枚举类型

}

p = new MySqlParameter("@val", 0)实际是调用的是第二个构建函数,0被转换成MySqlDbType.Decimal传进去了,没有为其Value赋值,理所当然的p.Value为null。

那么,岂不是传入的整数都会被当作枚举……不然,如果传入的非0,调用的却又是第一个构建函数,1是被当作object来处理的!

然后我很疑惑,为什么0会被自动转成枚举类型来处理,而非0则会被当作object呢?为什么为什么为什么?谁能告诉我答案?

疑惑归疑惑,问题是解决了……

DbParameter p = new MySqlParameter("@val", (object) 0);

Debug.Assert(p.Value == 0);  // 断言成功

©著作权归作者所有:来自51CTO博客作者边城__的原创作品,如需转载,请注明出处,否则将追究法律责任

object 枚举类型转换C#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值