请教一个oracle相关的问题
下面是一段更新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 ";
------解决方案--------------------1。
但是不返回错误值,不知道为什么?
=========
死了?
既然选择异常模型,就应该直接 throw 出来
2。
con.Dispose();
cmd.Dispose();
==========
一般情况下,没必要手动 Disponse,这里即不需要。
------解决方案--------------------1。
打断点,调试跟踪
2。
检查影响值:
int affectedRecords = cmd.ExecuteNonQuery ();
if(affectedRecords <= 0) {
throw new Exception( "没有行受影响。 ");
}
------解决方案--------------------楼主没有什么开发经验呀:
1:没有防止sql注入
2:不知道你上面这段代码的运行环境是什么样的,是不是多线程运行的,那属性 "K "是在哪儿定义的,不知道会不会造成线程脏读.
我想如果没有报错再加上你说得 "20 ", "100 ",最大的问题可能是线程问题
------解决方案--------------------我想,首先必须在服务端监控一下SESSIONS,看看是否有什么异常,有的SESSION还会显示相关的的SQL.
如果SESSION没有提示相关被阻塞情况,则可以考虑是否你的程序写的有问题,是否有可能为.NET的原因导致的。
比较妥当的做法就是设置表格或者文件自动记录执行的SQL以及相关信息,从而判断是什么导致的。