最近学三层,有很多问题要请教大家!
我用DCom,Ado,sql server
1 我用下面的语句咋就出"I/0 6"错误?
  while not eof do
        begin
          listbox1.items.add(trim(clientdataset1.fields[0].asstring));
          next
        end; 
   而我用for循环就没问题?迷惑ing...............
2 怎么处理多人同时修改一条记录的问题?
3 怎么使用事务?恳请大家赐教!
还有用dcom该注意那些容易出问题的地方?(这个问题问的不大好意思!)

解决方案 »

  1.   

    while not clientdataset1.eof do
            begin
              listbox1.items.add(trim(clientdataset1.fields[0].asstring));
              clientdataset1.next
            end;
      

  2.   

    2.加个锁
    3.使用事务要注意在一个事件中开始并结束事务;
    ADOConnection_sys.BeginTrans;
    ADOConnection_sys.CommitTrans;
      

  3.   

    你在while里面,clientdataset1要滚动,如:clientdataset1.next
      

  4.   

    1。while not clientdataset1.eof do
    2。更新模式有几种选择的,TRASISOLATION属性,看书吧
    3。starttransaction(开始事务) rollback(回滚) commit(提交)
      

  5.   

    1 eof next前面有with clientdataset的我省略了,不是这个原因!
    2 能给点处理事务的例子么?
    哪位能给个完整实现增\删\改的,业务代码在中间层处理的简单例子?
    我不知道怎么把业务逻辑放到中间层!:(
      

  6.   

    1.while not clientdataset1.eof do
            begin
              listbox1.items.add(trim(clientdataset1.fields[0].asstring));//看看是不是你的域对否,第一个字段是0,第二个是1
              clientdataset1.next
            end;2.在sql 中就加锁,select * from tb for update
    会在选中的行上加行级锁
    还可以 select * from tb for update with nowait  或者这样:
    Sql Server 中利用TIMESTAMP 字段来解决这种问题。
    当有任何修改时,TIMESTAMP的值都会改变,这样,当你试图修改别人已经改过的数据时,
    WHERE 子句找不到你的TIMESTAMP字段的值,就会抱错,你就知道数据已经被别人改过了。
    这是最经典的用法。 如果在DELPHI中,用事务最后一句:最好用事务!3。
    adoconnection1.begintrans;
    语句处理
    if 失败 then
     begin
         rollback;
    end else
         commit;
    end;
      

  7.   

    答问2.不让同时修改.(用lock)
    答问3.
    BeginTrans;//开始事务
    //被保护的代码,如在执行的过程中出现问题,数据库自动回滚.
    CommitTrans;//结束事务
      

  8.   

    用dcom最麻烦就是登录问题,delphi的那个dcomconnection控件并不负责登录到nt域上,不要让那个onlogin事件迷惑,即使在事件里面给出nt的域用户和密码也不能登录到nt域上,所以用在nt服务器上用dcom而客户机又没有登录到域上最好配制成所有用户都能启动并且身份标识用制定用户。
      

  9.   

    谢谢!
    我刚学,没试过在三层里用事务,我按自己的理解说说,大家多教教我!
    是不是这样用:
    server端写个method比如:
    AddNew(param:xxxx)
    begin
      sqlstr:='insert into xxxx value (param)'
      adocnn.beginTrans
      try
      xxxx(执行sqlstr)
      adocnn.commitTrans
      except
        adocnn.rollback
      end;
    end;
    client端点击增加,调用AddNew?
    大家看这样理解对不对!真的想学好三层,希望大家多多赐教!
    能帮忙贴段代码学学么?:)
      

  10.   

    你的 第一个问题 是因为最后一条纪录时也调用了next,把while do改成do while 就没错了
      

  11.   

    多个clientdataset连一个datasetprovider行不行啊?
      

  12.   

    ClientDataset.close后就把原来取到client的数据清空了么?