ExecuteNonQuery()与ExecuteScalar()
2015-10-08 23:15
344 查看
ps:针对之前上一句修改一下,是我理解的问题。
ExecuteNonQuery()执行 select,如果不存在结果总是返回-1(因为我想通过影响的行数来判断数据库是否已经存在该数据),很是郁闷。 存在返回记录,SELECT*返回1,查询id返回对应的id,这一点理解也可用它来作为判断。(VS2015调试时参数化断点居然看不见传进去,郁闷了好久没有考虑到这个问题,的确是失误)
后来查了一下msdn,发现原来是这样的。虽然 ExecuteNonQuery 不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1 。
后来的解决方案是,使用ExecuteScalar(),判断他的返回值是否为空.
那么接下来的问题是如何判断为空,执行ExecuteScalar()返回的是一个object的类型,那么就分两种情况考虑,不然会报异常的。
object result = command.ExecuteScalar();
情形一:查询有值,此时返回一个对象第一行第一列的值(ps:为了提高查询效率,不建议使用SELECT *,建议查询主键,SELECT ID),此时object.toString()有值,即可判断。
情形二:查询无值,此时object.toString()必定会报异常。此时需判断DBNull.Value== result。
综合以上:总结
if (result==null||DBNull.Value== result)
{
无记录
}
if (result!=null&&DBNull.Value!= result)
{
有记录
}
注意或,与的区别。
ExecuteNonQuery()执行 select,如果不存在结果总是返回-1(因为我想通过影响的行数来判断数据库是否已经存在该数据),很是郁闷。 存在返回记录,SELECT*返回1,查询id返回对应的id,这一点理解也可用它来作为判断。(VS2015调试时参数化断点居然看不见传进去,郁闷了好久没有考虑到这个问题,的确是失误)
后来查了一下msdn,发现原来是这样的。虽然 ExecuteNonQuery 不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1 。
后来的解决方案是,使用ExecuteScalar(),判断他的返回值是否为空.
那么接下来的问题是如何判断为空,执行ExecuteScalar()返回的是一个object的类型,那么就分两种情况考虑,不然会报异常的。
object result = command.ExecuteScalar();
情形一:查询有值,此时返回一个对象第一行第一列的值(ps:为了提高查询效率,不建议使用SELECT *,建议查询主键,SELECT ID),此时object.toString()有值,即可判断。
情形二:查询无值,此时object.toString()必定会报异常。此时需判断DBNull.Value== result。
综合以上:总结
if (result==null||DBNull.Value== result)
{
无记录
}
if (result!=null&&DBNull.Value!= result)
{
有记录
}
注意或,与的区别。
于博弈科技
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- Linux 自检和 SystemTap
- 数据库链接字符串查询网站
- 我是运营,我没有假期
- Python 七步捉虫法
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- DB2数据库的安装
- C#实现把指定数据写入串口
- CentOS下DB2数据库安装过程详解
- “传奇”图象数据存储方式
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案