博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么new MySqlParameter("@val", 0).Value == null?
阅读量:6894 次
发布时间:2019-06-27

本文共 793 字,大约阅读时间需要 2 分钟。

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

 
  1. DbParameter p = new MySqlParameter("@val", 0); 
  2. Debug.Assert(p.Value == 0);  // 这里断言失败,p.Value实际是null 

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

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

 
  1. public MySqlParameter(string name, object value) { 
  2.     // ...... 
  3.  
  4. public MySqlParameter(string name, MySqlDbType type) { 
  5.     // ...... 
  6.     // MySqlDbType是个枚举类型 

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

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

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

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

 
  1. DbParameter p = new MySqlParameter("@val", (object) 0); 
  2. Debug.Assert(p.Value == 0);  // 断言成功 

 

转载地址:http://gzzdl.baihongyu.com/

你可能感兴趣的文章
Vmware软件安装精讲
查看>>
mysql双主模式
查看>>
rpm 安装lamp
查看>>
区块链真的有这么厉害吗?--初识区块链后的感想(一)
查看>>
mongodb Profiling 通过慢查询日志分析查询慢的原因 相应优化
查看>>
Memcached管理与监控工具 MemAdmin
查看>>
mysql 主从复制读写分离
查看>>
在百花之中干掉一个杂草连接...
查看>>
HTML文档基本格式
查看>>
for 循环的关键字 break和continue
查看>>
Map集合的四种遍历方式
查看>>
MySQL监控项一些指标
查看>>
Thinkpad T430s NVS5400M Ubuntu 12.04安装
查看>>
定时拍照功能
查看>>
[Unity3d]SecurityException报错解决办法
查看>>
SCVMM创建Linux虚拟机模版
查看>>
添加 Pool Member - 每天5分钟玩转 OpenStack(123)
查看>>
NSDECODER v1.0
查看>>
游侠原创:vmware下android-x86-4.4-RC1体验
查看>>
OpenMNS--管理网络的绝好工具
查看>>