把异常写在日志中会继续执行try中的代码吗
try { //正常执行 } catch { //程序异常 } finally { //无论是否异常都执行这里面的代码 }
放finaly中。
finaly里放批量更新代码??? 还是写判断有多少没更新进去的,再将没更新进去的再更新进去,我是新手,不好意思啦,问问题不太明白。
@兔兔涂涂凸:不是在finaly里放批量更新的代码。可能我没明白你的意思。请你把你的需求在详细说明一下,我在帮你分析。
@程序人生,永无止境: 是这样的,假如我数据库中有100条数据,通过接口获取这些数据中的单号数据,循环这100条数据获得每条数据的单号,然后将这些单号赋值给一个属性,最后一起将这100个单号更新到数据库中,如果其中某条或多条异常了,它前面或后面的非异常的数据还能成功更新到数据库中。
@兔兔涂涂凸: 你这里所指的批量,那其实到了从程序里也是通过循环来一条一条更新,这里你也说对了。我明白你的意思,就是说如果有数据出错,那么其他数据还能正常跟新。
//比如你现在有100条数据 for (int i = 0; i < 100; i++) { try { // 这里放你要执行更新单条数据的代码,也就是i对应的那条数据 } catch { //如果i这条数据更新失败,则在这里写入日志,并且这样的话不影响下面的数据更新 } }
这样就可以了。
@程序人生,永无止境: 如果我在try里面执行更新单挑数据的代码的话,那有100条数据就是执行100次,也就会对数据库访问100次,现在想的是只访问一次数据库将要更新的数据更新到数据库中去。要是把更新100条数据的代码写在try里,异常了写日志还会返回到try里面执行吗??
@兔兔涂涂凸: 如果把更新100条数据的代码写在try里,那么异常了的话就不会在返回去try里了,而是直接结束整个流程。
我想问一下你更新数据库用的什么方式来更新的,ado.net?还是linq to sql, 用ado.net的话你可以 拼100条sql语句,然后在一次执行,但是这样做的话只能在数据库里去写日志了,而且还要写复杂sql语句,并且你在数据库中写日志也有些东西得不到,比如操作用户。如果是用linq to sql,那么也只能一条条的去修改,因为你要写日志,的一条一条知道到底有没有修改成功。如果你要只请求一次数据库也可以,但是就无法判断你哪些成功哪些失败了,你的日志就不准确了。
@程序人生,永无止境: 因为如果一条条去修改的话,数据少还可以,数据多的话再一次次去访问数据库就会很慢的,你说一次访问也可以,就是无法判断你哪些成功哪些失败了。我想问一下,你说的一次访问如果有数据出错了也能继续更新数据到数据库吗?
@兔兔涂涂凸: 这种方式只能在某种特定的情况下才能实现。你用的数据库操作方式是什么
@程序人生,永无止境: 是ado.net的
@兔兔涂涂凸: ado.net的话可以一次请求,你直接拼100条update 的sql语句,然后在一次提交就行。
update Person set Name='bdf' where Id=2 update Person set Name='dsdfddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd' where Id=5 update Person set Name='yang' where Id=21
你看我代码和图片,我模拟了同时修改3条数据的操作,其中第二天由于长度过大不能成功修改,但是第一条和第三条可以继续执行。
至于你要写日志,就比较麻烦点。1,可以在数据库中给表添加触发器,当数据修改的时候可以根据修改成功与否进行日志写入,但是它无法获取你操作用户。
@程序人生,永无止境:主要是那个updateall是个封装好的方法,只要前面通过接口获取要的数据,最后把数据给updateall这个方法就能实现批量更新了,不要循环也可以更新,
@兔兔涂涂凸: 那既然你已经有封装好的方法,直接调用就行。但是更新失败的日子就不能保证都对。
用循环的好处就好比,在检票口,需要一个个对乘客的票进行检查,票正确的才能通过,不正确的记录下来;如果不管乘客有没有票都一起让进站台,那你能确保那些乘客有票,哪些乘客没票。逐一检查就行循环一样,可以不漏掉一个不合格的,但是熟读慢些,否则就是速度很快,但是无法确保安全。
既然你已经有封装好的方法,那日志的问题,就在其他地方去实现吧。
@程序人生,永无止境: 嗯,准备在获取数据的地方拼sql语句,每条数据对应一条sql更新,最后将这些sql语句一起访问数据库,就这样试试了。 谢谢你了!!!
@兔兔涂涂凸: 不客气呢
凭什么不会?凭什么会?
代码呢.结构呢?
try
{
_salesRnRepository.UpdateAll(list.Where(t => t.SenderNO != ""), t => t.ColumnsToUpdate(c => c.SenderNO));
}
catch (Exception ex)
{
HelpMethod.WriteLog(ex);
}
try里面是批量更新数据,如果其中某条或多条错误,下面的数据怎么继续更新下去
_salesRnRepository.UpdateAll(list.Where(t => t.SenderNO != ""), t => t.ColumnsToUpdate(c => c.SenderNO));
看你这个语句,这并不是批量更新。他就是一个update语句: update table set senderno where senderno<>''
批量更新数据,如果其中某条或多条错误,下面的数据怎么继续更新下去:
for(var i=0;i<100;i++){
try{
update....
}catch(){
}
}
是用update给数据库中某个要更新的列更新数据,已经可以成功将数据更新进去了,现在就是如果其中某条或多条异常了,它前面或后面的非异常的数据怎么样能成功更新到数据库中。谢谢
根据你的需求,把try catch写在for循环里面,catch到之后,continue
会继续执行的
UpdateAll 方法一旦报错就会进入catch,就再也不会进入try语句。
所以如果要在某条记录出错后继续执行建议使用for(/for each等)循环。
当然,如果是mysql数据库可以用insert ignore
如果是oracle数据库可以在sql末尾加上LOG ERRORS REJECT LIMIT UNLIMITED
要是使用for的话,是不是只能一次更新一条呢
@兔兔涂涂凸: 也不绝对。你可以将数据分组执行batch。如果某个分组出错,这组就都标记为有问题重新校验后再插入。