日期:2014-05-18  浏览次数:20706 次

知道ActiveRecordBase.Update的朋友请进
朋友们,现在兄弟遇到这样一个问题。
使用ActiveRecord的FINDALL方法将符合条件的对象全部找出来之后,对这些对象进行遍历,并修改。调用Update方法。
代码如下:
if( callInfos != null )
  {
  foreach(NgnLogBEO beo in callInfos)
  {
  switch (deleteFlag)
  {
  case NgnLogBEO.DeleteFlag.NotDelete:
  beo.Deleted = NGN_LOG_DELETED_FLAG_NOT;
  break;
  case NgnLogBEO.DeleteFlag.Deleted:
  beo.Deleted = NGN_LOG_DELETED_FLAG_DELETED;
  break;
  default:
  break;
  }

  beo.UpdatedDate = DateTime.Now;
  beo.Update();
  }
  }

程序没有错误,代码能运行,并且更新也成功。现在的问题是:
第一:DBA告诉我,在数据库服务器端监视到对这个表的更新效率很低。原因是 “Update ... WHERE LOG_ID = :P30 --注意该表中LOG_ID为Varchar2型且有唯一性索引,但是若P30为数据类型则该SQL走全表扫描”.
第二:调用 beo.Update()时,内部更新机制是如何? 这个更新是根据主键来更新的吗?
第三:如果是根据主键来更新,那么它封装的更新语句应该是怎样的? where 语句如何封装。是写成 where Log_id=一个值。还是where Log_id='一个值'。还是会根据类型来判断是否使用单引号????



------解决方案--------------------
对象中为String类型 对应varchar2型吧 update是根据主键来更新的 如果对行为String则 对应where子句的会自动添加‘XXXX’