C#学习记录---ExecuteNonQuery()返回值问题

来源:互联网 发布:显卡驱动负优化 编辑:程序博客网 时间:2024/05/17 00:12

有些东西会用是都能用出来,但是针对一些比较细的东西还是比较容易健忘,所以就小记一下,以作备份:

 

        可以使用 ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE、INSERT 或 DELETE 语句,在不使用DataSet 的情况下更改数据库中的数据。

        虽然 ExecuteNonQuery 不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。

        对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。如果正在执行插入或更新操作的表上存在触发器,则返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。

 

ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete 语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚得话返回值为-1,对于这种更新操作 用我们平时所用的是否大于0的判断操作应该没有问题而且比较好,但是对于其他的操作如对数据库结构的操作,如果操作成功时返回的却是-1,这种情况跟我们平时的思维方式有点差距所以应该好好的注意了,例如对数据库共添加一个数据表的Create操作,当创建数据表成功时返回-1,如果操作失败的话(如数据表已经存在)往往会发生异常,所以执行这种操作时最好用try--catch--语句来容错。

 

 

所以ExecuteNonQuery()这个函数只是针对一  update、delete、insert语句进行操作,这时返回的是所影响的行数

如果对于select操作的话,返回值无论有没有结果都是-1,因为select操作返回的是一个object类型的数据,那么使用ExecuteNonQuery()后将object数据强制转换成int类型,这样就会引发数据丢失和不正确数据的错误,所以针对select操作使用Adapter、DataSet、DataTable、DataReader这些操作,它们能将Object数据进行区分,形成一个集合、一张表或者一行数据。

使用时,如果只有一张表的话,使用Adapter的Fill操作DataTable,这样产生的数据量小,占用内存也少;比DateSet相对好一些,DataSet是将整个数据库做一个映射,将数据提取到内存当中。

或者也可以使用DataReader方法,将数据一行一行的填充到表当中:例如 DataTable的Load(DataReader)方法

 

如果判断数据库中是否存在自己想要的数据,可以使用DataTable操作,也可以使用DataReader操作,通过判断DataReader.Read()是否为真或DataTable.Rows.Count > 0

这两种方法有一定的区别。如果在使用数据库时,DataReader是要和数据库一直建立连接时才能进行的操作,而DataTable却不需要,DataTable只需要将数据从数据库读取到内存当中就可以关闭数据库,这样可以减少数据库的连接数量,同时也可以减轻服务器的负载。

 

针对于ExecuteScalar()方法,通过这个也可以查询到数据库中的数据,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。

经常用到的ExecuteScalar()方法对数据判断是否存在。只是这种查询方法只能一条一条的查询,如果要进行大量数据匹配的话,使用DataTable会比较好一些。