我纠结的sql返回受影响行数与判断是否成功的问题

比如:deleteSQLWhere="delete TableA where ID in(1,2,3,4,5)";

           try
            {
                int i = sqlHelper.ExecuteNonQuery(CommandType.Text, deleteSQLWhere);
                if (i > 0)
                {
                    return true;
                }
            }
            catch (Exception ex)
            {
                LogMsg.WriteLog(ex.ToString());
                return false;
            }
            return false;

假如in里的ID全部存在,一般情况下,结果会是三种情况:

返回0,表示TableA没有in里的ID,所以执行失败。

返回5,表示成功删除5条数据。

由于表约束或主外键关联,导致无法删除的异常。还有语法错误。

如果是这样的话,上面的代码判断是正确的。我在怀疑有没有一种情况,比如说"delete TableA where ID in(1,2,3,4,5)",假设in里的数据存在且没有主外键关联等因素制约,会不会出现一部分执行成功,而另外一部分执行失败的情况呢?

假如这样的话,ADO.Net上对sql的执行结果判断就不严谨了。因为上面那段代码的本意是:这5条数据要么全部被删除,要么全部没有被删除,此时i>0就不能表示这个意思了。

我不知道,sql的执行机制是怎样的,没有深入学习数据库,我基本停留在增删改的阶段。所以也不知道像上面的一条语句,是不是要么成功要么失败的,类似事务的处理结果。

我的倾向应该是要么成功,要么失败的。

要不然判断的时候,i==想要执行的数据个数,这样就太麻烦了。而且很多业务是不知道要执行的数据个数的,此时在执行update和delete语句之前先查出来有多少条数据,就更麻烦了,一大堆的问题。

我冒死去Q群去问这个问题,结果只是被鄙视了好多次而已,道理也说了一大堆,然后就是自己去体会吧之类的话了。然并卵,我也不知道问谁了,又不认识这方面的专家,虽然这个是个那么不起眼的问题。

-------------------------------------------------------------------------------------

哦,有一个是可以确定的,就是在C#执行方法的sql语句参数里,写上两条sql语句,比如"update TableA set AID=2 where ID=3;delete TableB where ID=3;"。返回受影响行数>0判断为成功,显然是错误的。

这里推荐用事务,但用事务的时候可以两条语句合起来写,但判断的时候i==2即可,否则回滚。

时间: 2024-07-31 06:44:35

我纠结的sql返回受影响行数与判断是否成功的问题的相关文章

mysql执行update语句受影响行数是0

mybatis连接mysql数据库,发现同一个update执行多次,返回的int值都是1. 我记得同样的update再次执行时 受影响行数是0. 后来发现,我之前一直用的SQLyog是这样子的. 原来,不同的连接客户端执行update给出的受影响行数不同. 对于再次返回0,网上的资料是,MySQL 为了提升性能,当它发现要执行的修改内容与数据库中完全一致时,对它而言,此时修改是毫无意义的,反而会消耗一次执行修改的性能,于是它就不再做修改,因而受影响行数就是0. 至于mybatis,网上有说myb

Oracle sql%rowcount 返回影响行数;sql server @@RowCount返回影响行数

sql server中,返回影响行数是:If @@RowCount<1 Oracle中,返回影响行数是:If sql%rowcount<1 例: sqlserver: create procedure Proc_test @Stat int=0, @MsgId varchar(50)='', AS BEGIN Update T_Mt Set Stat=@Stat,OStat=@Stat,RptTime=Getdate() Where MsgId=@MsgId If @@RowCount<

sql%rowcount 返回影响行数

oracle中,返回影响行数是:If sql%rowcount 举例: update ut_calenderStatus t set t.calenderstatus=pi_flg, t.m=pi_M, t.n=pi_N, t.prolong=pi_prolong where t.fundcode=pi_fundcode; if sql%rowcount=0 then insert into ut_calenderStatus values (pi_fundcode,pi_flg,pi_M,pi

C# 存储过程返回影响行数

存储过程中完成更新操作后,使用@@rowcount返回影响行数.如果有多条语句,可定义变量保存影响行数.示例如下 ALTER PROCEDURE [dbo].[P_CSM_UpdateHandleResultEmpName] @HandleIndex int=-1 AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT

[小问题笔记(八)] 常用SQL(读字段名,改字段名,打印影响行数,添加默认值,查找存储过程等)

读取所有字段,自然排序 declare @fields varchar(max) Select @fields=ISNULL(@fields,'')++name+',' from syscolumns Where ID=OBJECT_ID('contact') order by colorder print @fields 读取所有字段,名称排序 declare @fields varchar(max) Select @fields=ISNULL(@fields,'')++name+',' fr

mysql sql获取上条插入id,update影响行数

1.获取上条插入数据 LAST_INSERT_ID(); 2.获取update影响行数. ROW_COUNT(); mysql> UPDATE t -> SET address = 'beijing111' -> WHERE id = 1 -> AND NAME = 'yubowei'; Query OK, 1 row affected (0.30 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> mysql> SEL

CI中获取读操作的结果集行数+获取写操作的影响行数

本质:读操作,用mysql_num_rows函数,写操作用mysql_affected_rows函数 mysql_num_rows() 返回结果集中行的数目.此命令仅对 SELECT 语句有效.要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows(). CI中的方法: 读操作,获取行数: $query->num_rows() 该函数将会返回当前请求的行数.在本例子中, $query 表示当前 SQL 所产生的请求结果对象:

oracle 与sql serve 获取随机行数的数据

Oracle 随机获取N条数据    当我们获取数据时,可能会有这样的需求,即每次从表中获取数据时,是随机获取一定的记录,而不是每次都获取一样的数据,这时我们可以采取Oracle内部一些函数,来达到这样的目的1) select * from (select * from tablename order by sys_guid()) where rownum < N; 2) select * from (select * from tablename order by dbms_random.va

MS SQL查询所有表行数,获取所有数据库名,表名,字段名

1.获取所有数据库名 --SELECT Name FROM Master..SysDatabases ORDER BY Name -- 2.获取所有表名: --SELECT Name NAMEtemp,* FROM TEST..SysObjects Where XType='U' ORDER BY Name --表名  ----XType='U':表示所有用户表; ----XType='S':表示所有系统表; 3.获取所有字段名: SELECT Name FROM SysColumns WHER