下面是一段更新pg_fs表内分值的语句,曾经找了十几个人同时更新没有问题,当把程序安装到客户的服务器上的时候,找了100人同时更新分数的时候,开始还能更新,但是一会儿之后发现所有人的数据都更新不了了,但是不返回错误值,不知道为什么?谁能帮我看看是怎么回事啊?数据库用的是oracle10g。不同的人是update同一个表中的不同记录。
OracleConnection con=DB.createConnection ();
con.Open ();
if(k>15)
{
k = 15;
}
string sql = "update pg_fs set yjjy ='" + yjjy + "',pgrq = to_date(substr('" + DateTime.Now.Date.ToString("yyyyMMdd HH:mm:ss") + "',1,17),'yyyy-mm-dd hh24:mi:ss')";
for(int i = 1;i <= k;i++)
{
sql +=",score" + i.ToString() + " = '" + score[i-1] + "'";
}
sql += " where bpgr = '" + bpgr + "' and pgr = '" + pgr + "' and lx = '" + lx + "' and term = '" + term + "' and lesson = '" + lesson + "'";
OracleTransaction tx;
tx = con.BeginTransaction();
OracleCommand cmd=new OracleCommand (sql,con,tx);
try
{
cmd.ExecuteNonQuery ();
tx.Commit();
}
catch(Exception err)
{
tx.Rollback();
return err.Message;
}
finally
{
con.Close();
tx.Dispose();
con.Dispose();
cmd.Dispose();
}
return "ok";
OracleConnection con=DB.createConnection ();
con.Open ();
if(k>15)
{
k = 15;
}
string sql = "update pg_fs set yjjy ='" + yjjy + "',pgrq = to_date(substr('" + DateTime.Now.Date.ToString("yyyyMMdd HH:mm:ss") + "',1,17),'yyyy-mm-dd hh24:mi:ss')";
for(int i = 1;i <= k;i++)
{
sql +=",score" + i.ToString() + " = '" + score[i-1] + "'";
}
sql += " where bpgr = '" + bpgr + "' and pgr = '" + pgr + "' and lx = '" + lx + "' and term = '" + term + "' and lesson = '" + lesson + "'";
OracleTransaction tx;
tx = con.BeginTransaction();
OracleCommand cmd=new OracleCommand (sql,con,tx);
try
{
cmd.ExecuteNonQuery ();
tx.Commit();
}
catch(Exception err)
{
tx.Rollback();
return err.Message;
}
finally
{
con.Close();
tx.Dispose();
con.Dispose();
cmd.Dispose();
}
return "ok";
解决方案 »
- can not start oracledbconsole errorcode 1
- JSP连接ORACLE数据库的问题
- oracle查询语句,不用sum()方法,在java中实现相同id的金额累加
- job 任务 重新启动服务器后 next date 变成4000-1-1,怎么调成正常?
- 如何在命令提示符下连接ORACLE数据库?
- 数据库编码问题
- 没分~初学ORCAL 谁告诉我个ORCAL的作业怎么写啊 最好有例子 谢谢
- 请教字符数据中文数字混合时排序问题;
- oracle8i問題?
- 急!sql分类查询合计横排,请教高手!
- 请问,oracle中怎样计算两个日期字段之间的小时差额?
- 请问一个批量更新的问题?
但是不返回错误值,不知道为什么?
=========
死了?
既然选择异常模型,就应该直接 throw 出来2。
con.Dispose();
cmd.Dispose();
==========
一般情况下,没必要手动 Disponse,这里即不需要。
程序没有死,程序照常运行,速度还挺快也没有卡,直接return 'ok',跳转到保存成功的页面,就是数据库里的数据没有更新。
以前也没有手动dispose,也还是不行。
打断点,调试跟踪2。
检查影响值:int affectedRecords = cmd.ExecuteNonQuery ();
if(affectedRecords <= 0) {
throw new Exception("没有行受影响。");
}
1:没有防止sql注入
2:不知道你上面这段代码的运行环境是什么样的,是不是多线程运行的,那属性"K"是在哪儿定义的,不知道会不会造成线程脏读.我想如果没有报错再加上你说得"20","100",最大的问题可能是线程问题
我没有刻意的用多线程,是不是有什么特殊的设置?登陆查询什么的都没问题,就是更新的时候人多的话就不行了。
如果SESSION没有提示相关被阻塞情况,则可以考虑是否你的程序写的有问题,是否有可能为.NET的原因导致的。
比较妥当的做法就是设置表格或者文件自动记录执行的SQL以及相关信息,从而判断是什么导致的。