今天在一份资料上看到如下代码:
原文如下:
begin
  table1.edit;
  table1.fieldbyname('姓名').asstring:=edit1.text;//不建议
  table1.fieldbyname('日期').asdatetime:=date;
  ///
  table1['姓名']:=edit1.text;//建议//简短/扩充性好
  //table1.fieldvaluest['姓名']:=edit1.text;//borland建议的方法。
  table1['日期']:=date;
end;
结束。
请教各位:1、前辈为什么这样建议我们呢?
          2、table1['姓名']不用指出字段类型,难道是增强了灵活性吗?
          3、依照您来看用什么方法访问、修改数据库的字段比较安全?
欢迎大家参与,谢谢!

解决方案 »

  1.   

    1、这个只是建议,是前辈的经验,没有为什么。
    2、的确,不管姓名字段是什么类型,都会自动转换,可能在帮助中说使用变体类型会造成程序效率差,但是看看VCL源代码,发现,即时AsString赋值,也是转换成变体类型后在赋值。(这个没有仔细研究好像是这样)
    3、hoho不知。其实这个我看过其中还有一个就是建议使用
    While not Eof do begin end 来循环数据集而不建议用For循环,hoho这个我就不懂了。不是For循环效率好一些,还有如果在写While时如果忘记写Next ,则非常容易造成死循环,但是用For就不会了。
      

  2.   

    xthmpro_cn :谢谢您的发言,我也是这样猜想的,并作了一些试验发现的确会自动转换,至于for的问题我觉得DELPHI在数据库时应该用.eof,运算时应该用for,因为前者运算一次,后者先把数据库统计一遍,然后再从头开始就慢了,不知道这样解释对否。
      

  3.   

    这个就说不清了。掉用RecordCount的却是要访问方法,在ADO中访问的时RecordSet的COM接口的方法。但是这个我们只访问一次,而且,在AdoRecordSet中好像ReordCount是个变量不会造成扫描整个数据集来统计RecordCount,这一次的调用使用For循环时,CPU会使用寄存器来优化循环,提高指令的Cach的命中率。当然这个只是猜测,我并不祥知。仁者见仁,智者见智。
      

  4.   

    我找到一个解答的连接大家去看看吧:http://search.csdn.net/Expert/topic/724/724036.xml?temp=.2103235大家继续。
      

  5.   

    No.6 遍历数据集
    var
      I: Integer;
    begin
      Query1.First;
      for I := 0 to Query1.RecordCount - 1 do begin //不建议//容易被影响
        Query1.Next;
        {};
      end;
    原来的是这样的,不知这里的“容易被影响”是指什么?
    如果是指Query1.RecordCount的值受到影响,显然是星星前辈搞错了。
    在For循环的时候,循环的次数是一次计算好,存储在寄存器中的,在循环的过程中是不会再计算RedordCount的值的。
    如果For循环之中有删除操作,建议使用DownTo语句。其他的我想不出什么:“容易被影响”