对RemObjects不是很熟悉,照着例子写个测试程序,在调用 SQLExecuteCommand('delete from xxx')
时报错“No more results”数据库为Oracle,连接SQL数据执行SQLExecuteCommand是可以的。熟悉的朋友能否提醒一下需要注意哪些地方,先谢谢了。
procedure TClientForm.Button2Click(Sender: TObject);
var
  aRowsAffacted: integer;
begin
  try
    aRowsAffacted := FService.SQLExecuteCommand(AnsiToUtf8(Memo.Text));
    ShowMessage('aRowsAffacted:'#9 + intToStr(aRowsAffacted));
  except
    on e: Exception do
      ShowMessage(e.Message);
  end;
end;  

解决方案 »

  1.   

    查看你的服务那边SQLExecuteCommand方法是否有返回值得,和你这边调用的结构是否一样。。
      

  2.   

    谢谢楼上的朋友。服务器端程序的AllowExecuteSQL属性已经设置为True了,再没找到其他相关属性。只有客户端程序的DARemoteDataAdapter控件的GetDataCall中的MethodName属性可以选择为SQLExecuteCommand。问题应该出在Oracle数据库上,SQL2000上调用SQLExecuteCommand更新数据的sql操作是能成功执行的。
    请各位熟悉RemObjects朋友帮忙看看。
      

  3.   

      我也是刚开始用,不过我服务端程序用的控件好象跟你的不一样,我用的是
    TROIndyHTTPServer 和TROBinMessage,
      

  4.   

    呵呵,我也是用跟你一样的控件。
    只是RO自动生成的 ***_Impl单元继承TDataAbstractService类的属性需要做一些设置才可以在客户端执行SQL。
      

  5.   

    RO自动生成的 ***_Impl单元
      这个单元可以填加一些方法,让客户端可以通过这些方法调用数据,比如:
          procedure ExecHasReSult(SqlText:string;out FDelta:variant);
          begin
             //执行Sql语句 
               Result :=clientdataset1.data;
          end; 你的方法应该跟我这边的不一样吧..我没有调用TDataAbstractService类
      

  6.   

    能给出你这个方法的代码给我参考一下么?谢谢了!Result :=clientdataset1.data; 
    你在服务器端返回到ClientDataSet,那客户端通过什么方法获取返回的结果?
      

  7.   

    可以啊,,客户端也可以
      如:  
       var 
         FDelta:variant;
        ExecHasReSult('select * from sysobjects',FDelta)         
        clientDataset.data := FDelta;//这样,就传到客户端了。。
      

  8.   

    能把这个方法的ExecHasReSult代码贴出来我看看么?
      

  9.   

          procedure ExecHasReSult(SqlText:string;out FDelta:variant); 
          var
            adoquery:TADoQuery;
            DataSetProvider:TDataSetProvider;
          begin  
             DataSetProvider :=TDataSetProvider.Create(Nil); 
             adoquery := TADoQuery.Create(nil);
             Try
               DataSetProvider.dataset := Adoquery; 
               adoquery.connection := con;//con是已经连接的Tconnection, 
               adoquery.close;
               adoquery.sql.clear;
               adoquery.sql.text := SqlText;
               adoquery.open;
               FDelta := DataSetProvider.data;             
                  
             Finally
               FreeAndNil(adoquery);
               FreeAndNil(DataSetProvider);
             end;
          end; 
      

  10.   

    这种方式其实只是利用RO来做通讯,数据存取还是Delphi自带的控件来实现,挺好的一种方法。
    可能对于移植老的项目比较方便。我实在找不出原因所在,只好把uDAADODriver.pas中调用ExecSQL的函数修改了一下,注释掉异常处理就可以了,但是不知道会不会产生什么影响。function TDAEADOQuery.DoExecute: integer;
    begin
      result := TADOQuery(Dataset).ExecSQL;
      //if TADOQuery(Dataset).Connection.Errors.Count>0 then
        //raise Exception.Create(TADOQuery(Dataset).Connection.Errors.Item[0].Description);
    end;
    结贴了,谢谢各位关注的朋友,希望熟悉RO的朋友能告知真正的原因。